{"openapi":"3.1.0","info":{"title":"Clickr API","version":"2","description":"Read the datasets Clickr keeps in sync from Buildertrend and QuickBooks, and run QuickBooks actions. The same reference as pages: https://clickr.cloud/developers/"},"servers":[{"url":"https://api.clickr.cloud"}],"security":[{"apiKey":[]}],"tags":[{"name":"Datasets","description":"Read the records Clickr keeps in sync from your connectors, filtered, sorted and paged."},{"name":"QuickBooks","description":"Create, read and update projects, convert estimates to invoices and reactivate customers. Each call starts a run."},{"name":"Runs","description":"Check on a QuickBooks action: queued, processing, then successful or failed, with what it did."},{"name":"Account","description":"The account a key belongs to."}],"paths":{"/v2/datasets/{datasetId}/records":{"get":{"operationId":"listRecords","summary":"List records","description":"Returns a page of records from one of your datasets, filtered and sorted. Reading records never uses a run.\n\nEach dataset's page lists the fields its records carry. Filter and sort on any of them.\n\nNo daily limit.\n\nYour access on the account must include this dataset.","tags":["Datasets"],"parameters":[{"name":"datasetId","in":"path","required":true,"description":"The dataset to read. Copy it from the dataset's API panel in Clickr, or ask the MCP tool list_datasets.","schema":{"type":"string"}},{"name":"filter","in":"query","style":"deepObject","explode":true,"description":"Keeps the records where the field matches: filter[jobName][contains]=patel. Operators are eq, ne, gt, gte, lt, lte, contains and in. in takes a comma-separated list and contains ignores case. Repeat it to combine filters; a record must match all of them.","schema":{"type":"object","additionalProperties":{"type":"object","additionalProperties":{"type":"string"}}}},{"name":"sort","in":"query","required":false,"description":"Up to 3 fields, comma-separated: sort=jobName,-startDate. Prefix a field with a minus sign, or add :desc, to sort it descending.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"How many records to return, from 1 to 200. Defaults to 50.","schema":{"type":"integer"}},{"name":"skip","in":"query","required":false,"description":"How many matching records to skip before the page starts. Defaults to 0.","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"records":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/BuildertrendSchedules"},{"$ref":"#/components/schemas/BuildertrendTasks"},{"$ref":"#/components/schemas/BuildertrendLeads"},{"$ref":"#/components/schemas/BuildertrendLeadActivities"},{"$ref":"#/components/schemas/BuildertrendJobs"},{"$ref":"#/components/schemas/BuildertrendChangeOrders"},{"$ref":"#/components/schemas/BuildertrendEstimates"},{"$ref":"#/components/schemas/BuildertrendPurchaseOrders"},{"$ref":"#/components/schemas/BuildertrendDailyLogs"},{"$ref":"#/components/schemas/BuildertrendInvoices"},{"$ref":"#/components/schemas/BuildertrendBills"},{"$ref":"#/components/schemas/BuildertrendLeadProposals"},{"$ref":"#/components/schemas/BuildertrendSelections"},{"$ref":"#/components/schemas/BuildertrendBidPackages"},{"$ref":"#/components/schemas/BuildertrendJobCostingBudget"},{"$ref":"#/components/schemas/BuildertrendDocuments"},{"$ref":"#/components/schemas/BuildertrendTimeClocks"},{"$ref":"#/components/schemas/BuildertrendInternalUsers"},{"$ref":"#/components/schemas/BuildertrendClientContacts"},{"$ref":"#/components/schemas/QuickbooksProjects"}]},"description":"The page of records, with the fields listed on the dataset's page."},"count":{"type":"number","description":"How many records match the filters, across every page."},"limit":{"type":"number","description":"The page size used."},"skip":{"type":"number","description":"The offset used."},"sort":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"direction":{"type":"string","enum":["asc","desc"]}},"required":["field","direction"]},"description":"The sort applied, as field and direction. The last entry is always _id, which keeps pages stable."}},"required":["records","count","limit","skip","sort"]}}}},"400":{"description":"Invalid request: A filter, sort, limit or skip can't be read. The message names the parameter and what was expected.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"No API Key provided: The Authorization header is missing.\n\nNo account found for api key provided: The key isn't recognised: mistyped, revoked, or held by someone who has left the account.\n\nNo integration found for account: The account has no connector connected yet.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Forbidden: Your access on the account doesn't include this dataset.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Failed to list dataset records: No dataset on your account has this id.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"500":{"description":"Failed to list dataset records: The id isn't a valid dataset id.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/files/{token}":{"get":{"operationId":"downloadAFile","summary":"Download a file","description":"Downloads a file attached to a record. You don't build this URL: it arrives on the record, as downloadUrl.\n\nDaily logs carry a downloadUrl on each entry in files, and each Documents record carries its own. The link is the credential, so it needs no API key: follow it as it is, from code or an assistant. It works for 1 hour.\n\nAn expired link and one that was never valid get the same answer. Read the record again for a fresh link.\n\nNo daily limit.\n\nEach link works for 1 hour.","tags":["Datasets"],"security":[],"parameters":[{"name":"token","in":"path","required":true,"description":"The signed token at the end of a record's downloadUrl.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"404":{"description":"Not found: The link has expired, was revoked or was never valid, or the file is no longer on the record.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"502":{"description":"Upstream error: Buildertrend didn't return the file. Try again shortly.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/v2/integrations/quickbooks/projects":{"post":{"operationId":"createAProject","summary":"Create a project","description":"Creates a project in QuickBooks for an existing customer. Intuit's API offers Projects only to Intuit partners; this endpoint works on any QuickBooks account connected to Clickr.\n\nThe call returns at once with a receipt. The project is created by a run, which usually finishes in 3 to 5 minutes: check it with Get a run, or pass a statusCallbackUrl.\n\nUses 1 run: 100 a day on Standard, 500 on Velocity, reset at midnight UTC.\n\nOn Standard, 1 call every 30 seconds across the Projects endpoints.","tags":["QuickBooks"],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"projectName":{"type":"string","description":"The new project's name."},"customerName":{"type":"string","description":"The QuickBooks customer the project belongs to."},"projectCode":{"description":"The Project ID field on the QuickBooks project form: your own reference, such as a job number. Not the projectId QuickBooks assigns. Ignored if the form has no Project ID field.","type":"string"},"startDate":{"type":"string","description":"Start date, as MM/DD/YYYY."},"endDate":{"type":"string","description":"End date, as MM/DD/YYYY."},"status":{"type":"string","enum":["not-started","in-progress","completed","canceled","cancelled"],"description":"The project's status. Both spellings of cancelled are accepted."},"notes":{"description":"The project's notes.","type":"string"},"billingAddress":{"description":"The project's billing address.","type":"object","properties":{"country":{"type":"string","description":"Country."},"streetAddress1":{"type":"string","description":"First line of the street address."},"streetAddress2":{"description":"Second line of the street address.","type":"string"},"city":{"type":"string","description":"City."},"state":{"type":"string","description":"State or region."},"zipCode":{"type":"string","description":"ZIP or postal code."}},"required":["country","streetAddress1","city","state","zipCode"]},"shippingAddress":{"description":"The project's shipping address.","type":"object","properties":{"country":{"type":"string","description":"Country."},"streetAddress1":{"type":"string","description":"First line of the street address."},"streetAddress2":{"description":"Second line of the street address.","type":"string"},"city":{"type":"string","description":"City."},"state":{"type":"string","description":"State or region."},"zipCode":{"type":"string","description":"ZIP or postal code."}},"required":["country","streetAddress1","city","state","zipCode"]},"customFields":{"description":"Custom fields to fill on the project form.","type":"array","items":{"type":"object","properties":{"label":{"type":"string","description":"The custom field's name, as it appears on the project form."},"value":{"type":"string","description":"The value to set."},"fieldType":{"type":"string","enum":["text","dropdown"],"description":"Whether the field is free text or a dropdown in QuickBooks."}},"required":["label","value","fieldType"]}},"statusCallbackUrl":{"description":"A URL Clickr POSTs the run's result to when it finishes, as JSON with your metaData. Sent once, with a 30-second timeout.","type":"string"},"metaData":{"description":"Any JSON object of your own, such as your id for the job. Sent back with the result to statusCallbackUrl.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["projectName","customerName"]},"example":{"projectName":"Henderson Residence Addition","customerName":"Mark Henderson","projectCode":"J-2041","startDate":"11/10/2026","status":"in-progress","statusCallbackUrl":"https://example.com/clickr/runs","metaData":{"jobNumber":"2041"}}}}},"responses":{"200":{"description":"The run was started. Its result comes from Get a run, or is POSTed to statusCallbackUrl.","content":{"application/json":{"schema":{"type":"object","properties":{"receipt":{"type":"string","description":"The id of the run this call started. Pass it to Get a run."}},"required":["receipt"]}}}},"401":{"description":"No API Key provided: The Authorization header is missing.\n\nNo account found for api key provided: The key isn't recognised: mistyped, revoked, or held by someone who has left the account.\n\nNo integration found for account: The account has no connector connected yet.\n\nThis integration is still pending setup…: QuickBooks isn't fully set up in Clickr: its sign-in or two-factor setup is unfinished. The error says what to do.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Forbidden: Your access on the account doesn't include this action.\n\nDaily cap exceeded: The account has used its runs for the day: 100 on Standard, 500 on Velocity. They reset at midnight UTC.\n\nRate limit exceeded: A second call within 30 seconds on Standard. Velocity has no wait.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"500":{"description":"Failed to create project: The body is missing projectName or customerName, or a field is in the wrong format. The message says which.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}},"get":{"operationId":"getAProject","summary":"Get a project","description":"Reads a QuickBooks project's name, status, dates, notes and custom fields, by its id or its name.\n\nLike the other QuickBooks actions this starts a run, so the project arrives in the run's data, not in this response. callbackUrl is required.\n\nUses 1 run: 100 a day on Standard, 500 on Velocity, reset at midnight UTC.\n\nOn Standard, 1 call every 30 seconds across the Projects endpoints.","tags":["QuickBooks"],"parameters":[{"name":"projectId","in":"query","required":false,"description":"QuickBooks' id for the project. Give this or projectName.","schema":{"type":"string"}},{"name":"projectName","in":"query","required":false,"description":"The project's name. Give this or projectId.","schema":{"type":"string"}},{"name":"callbackUrl","in":"query","required":true,"description":"A URL Clickr POSTs the project to when the run finishes.","schema":{"type":"string"}}],"responses":{"200":{"description":"The run was started. Its result comes from Get a run, or is POSTed to statusCallbackUrl.","content":{"application/json":{"schema":{"type":"object","properties":{"receipt":{"type":"string","description":"The id of the run this call started. Pass it to Get a run."}},"required":["receipt"]}}}},"400":{"description":"Must include projectId or projectName in the query string: Neither was given.\n\nMust include callbackUrl in the query string: callbackUrl is missing.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"No API Key provided: The Authorization header is missing.\n\nNo account found for api key provided: The key isn't recognised: mistyped, revoked, or held by someone who has left the account.\n\nNo integration found for account: The account has no connector connected yet.\n\nThis integration is still pending setup…: QuickBooks isn't fully set up in Clickr: its sign-in or two-factor setup is unfinished. The error says what to do.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Forbidden: Your access on the account doesn't include this action.\n\nDaily cap exceeded: The account has used its runs for the day: 100 on Standard, 500 on Velocity. They reset at midnight UTC.\n\nRate limit exceeded: A second call within 30 seconds on Standard. Velocity has no wait.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}},"put":{"operationId":"updateAProject","summary":"Update a project","description":"Changes a QuickBooks project's name, customer, status, dates, notes, addresses or custom fields. Only the fields you send change.\n\nFind the project by projectId, or on Velocity by its current name with projectNameIdentifier.\n\nUses 1 run: 100 a day on Standard, 500 on Velocity, reset at midnight UTC.\n\nOn Standard, 1 call every 30 seconds across the Projects endpoints.","tags":["QuickBooks"],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"projectId":{"description":"QuickBooks' id for the project to update. Required unless you give projectNameIdentifier.","type":"string"},"projectNameIdentifier":{"description":"The project's current name, to find it by. Velocity only.","type":"string"},"projectName":{"description":"A new name for the project.","type":"string"},"customerName":{"description":"A different QuickBooks customer for the project.","type":"string"},"projectCode":{"description":"The Project ID field on the QuickBooks project form: your own reference, such as a job number. Not the projectId QuickBooks assigns. Ignored if the form has no Project ID field.","type":"string"},"startDate":{"type":"string","description":"Start date, as MM/DD/YYYY."},"endDate":{"type":"string","description":"End date, as MM/DD/YYYY."},"status":{"type":"string","enum":["not-started","in-progress","completed","canceled","cancelled"],"description":"The project's status. Both spellings of cancelled are accepted."},"notes":{"description":"The project's notes.","type":"string"},"billingAddress":{"description":"The project's billing address.","type":"object","properties":{"country":{"type":"string","description":"Country."},"streetAddress1":{"type":"string","description":"First line of the street address."},"streetAddress2":{"description":"Second line of the street address.","type":"string"},"city":{"type":"string","description":"City."},"state":{"type":"string","description":"State or region."},"zipCode":{"type":"string","description":"ZIP or postal code."}},"required":["country","streetAddress1","city","state","zipCode"]},"shippingAddress":{"description":"The project's shipping address.","type":"object","properties":{"country":{"type":"string","description":"Country."},"streetAddress1":{"type":"string","description":"First line of the street address."},"streetAddress2":{"description":"Second line of the street address.","type":"string"},"city":{"type":"string","description":"City."},"state":{"type":"string","description":"State or region."},"zipCode":{"type":"string","description":"ZIP or postal code."}},"required":["country","streetAddress1","city","state","zipCode"]},"customFields":{"description":"Custom fields to fill on the project form.","type":"array","items":{"type":"object","properties":{"label":{"type":"string","description":"The custom field's name, as it appears on the project form."},"value":{"type":"string","description":"The value to set."},"fieldType":{"type":"string","enum":["text","dropdown"],"description":"Whether the field is free text or a dropdown in QuickBooks."}},"required":["label","value","fieldType"]}},"statusCallbackUrl":{"description":"A URL Clickr POSTs the run's result to when it finishes, as JSON with your metaData. Sent once, with a 30-second timeout.","type":"string"},"metaData":{"description":"Any JSON object of your own, such as your id for the job. Sent back with the result to statusCallbackUrl.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}}},"example":{"projectId":"4821","status":"completed","endDate":"12/18/2026","statusCallbackUrl":"https://example.com/clickr/runs"}}}},"responses":{"200":{"description":"The run was started. Its result comes from Get a run, or is POSTed to statusCallbackUrl.","content":{"application/json":{"schema":{"type":"object","properties":{"receipt":{"type":"string","description":"The id of the run this call started. Pass it to Get a run."}},"required":["receipt"]}}}},"401":{"description":"No API Key provided: The Authorization header is missing.\n\nNo account found for api key provided: The key isn't recognised: mistyped, revoked, or held by someone who has left the account.\n\nNo integration found for account: The account has no connector connected yet.\n\nThis integration is still pending setup…: QuickBooks isn't fully set up in Clickr: its sign-in or two-factor setup is unfinished. The error says what to do.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Forbidden: Your access on the account doesn't include this action.\n\nDaily cap exceeded: The account has used its runs for the day: 100 on Standard, 500 on Velocity. They reset at midnight UTC.\n\nRate limit exceeded: A second call within 30 seconds on Standard. Velocity has no wait.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"429":{"description":"Updating Projects through projectNameIdentifier is not available on your account plan…: projectNameIdentifier was sent on Standard.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"500":{"description":"Failed to update project: The body has no projectId (or projectNameIdentifier), or a field is in the wrong format. The message says which.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/integrations/quickbooks/projects":{"post":{"operationId":"createAProjectLegacy","summary":"Create a project","description":"Creates a project in QuickBooks for an existing customer. Intuit's API offers Projects only to Intuit partners; this endpoint works on any QuickBooks account connected to Clickr.\n\nThe call returns at once with a receipt. The project is created by a run, which usually finishes in 3 to 5 minutes: check it with Get a run, or pass a statusCallbackUrl.\n\nUses 1 run: 100 a day on Standard, 500 on Velocity, reset at midnight UTC.\n\nOn Standard, 1 call every 30 seconds across the Projects endpoints.","tags":["QuickBooks"],"deprecated":true,"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"projectName":{"type":"string","description":"The new project's name."},"customerName":{"type":"string","description":"The QuickBooks customer the project belongs to."},"projectCode":{"description":"The Project ID field on the QuickBooks project form: your own reference, such as a job number. Not the projectId QuickBooks assigns. Ignored if the form has no Project ID field.","type":"string"},"startDate":{"type":"string","description":"Start date, as MM/DD/YYYY."},"endDate":{"type":"string","description":"End date, as MM/DD/YYYY."},"status":{"type":"string","enum":["not-started","in-progress","completed","canceled","cancelled"],"description":"The project's status. Both spellings of cancelled are accepted."},"notes":{"description":"The project's notes.","type":"string"},"billingAddress":{"description":"The project's billing address.","type":"object","properties":{"country":{"type":"string","description":"Country."},"streetAddress1":{"type":"string","description":"First line of the street address."},"streetAddress2":{"description":"Second line of the street address.","type":"string"},"city":{"type":"string","description":"City."},"state":{"type":"string","description":"State or region."},"zipCode":{"type":"string","description":"ZIP or postal code."}},"required":["country","streetAddress1","city","state","zipCode"]},"shippingAddress":{"description":"The project's shipping address.","type":"object","properties":{"country":{"type":"string","description":"Country."},"streetAddress1":{"type":"string","description":"First line of the street address."},"streetAddress2":{"description":"Second line of the street address.","type":"string"},"city":{"type":"string","description":"City."},"state":{"type":"string","description":"State or region."},"zipCode":{"type":"string","description":"ZIP or postal code."}},"required":["country","streetAddress1","city","state","zipCode"]},"customFields":{"description":"Custom fields to fill on the project form.","type":"array","items":{"type":"object","properties":{"label":{"type":"string","description":"The custom field's name, as it appears on the project form."},"value":{"type":"string","description":"The value to set."},"fieldType":{"type":"string","enum":["text","dropdown"],"description":"Whether the field is free text or a dropdown in QuickBooks."}},"required":["label","value","fieldType"]}},"statusCallbackUrl":{"description":"A URL Clickr POSTs the run's result to when it finishes, as JSON with your metaData. Sent once, with a 30-second timeout.","type":"string"},"metaData":{"description":"Any JSON object of your own, such as your id for the job. Sent back with the result to statusCallbackUrl.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["projectName","customerName"]},"example":{"projectName":"Henderson Residence Addition","customerName":"Mark Henderson","projectCode":"J-2041","startDate":"11/10/2026","status":"in-progress","statusCallbackUrl":"https://example.com/clickr/runs","metaData":{"jobNumber":"2041"}}}}},"responses":{"200":{"description":"The run was started. Its result comes from Get a run, or is POSTed to statusCallbackUrl.","content":{"application/json":{"schema":{"type":"object","properties":{"receipt":{"type":"string","description":"The id of the run this call started. Pass it to Get a run."}},"required":["receipt"]}}}},"401":{"description":"No API Key provided: The Authorization header is missing.\n\nNo account found for api key provided: The key isn't recognised: mistyped, revoked, or held by someone who has left the account.\n\nNo integration found for account: The account has no connector connected yet.\n\nThis integration is still pending setup…: QuickBooks isn't fully set up in Clickr: its sign-in or two-factor setup is unfinished. The error says what to do.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Forbidden: Your access on the account doesn't include this action.\n\nDaily cap exceeded: The account has used its runs for the day: 100 on Standard, 500 on Velocity. They reset at midnight UTC.\n\nRate limit exceeded: A second call within 30 seconds on Standard. Velocity has no wait.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"500":{"description":"Failed to create project: The body is missing projectName or customerName, or a field is in the wrong format. The message says which.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}},"get":{"operationId":"getAProjectLegacy","summary":"Get a project","description":"Reads a QuickBooks project's name, status, dates, notes and custom fields, by its id or its name.\n\nLike the other QuickBooks actions this starts a run, so the project arrives in the run's data, not in this response. callbackUrl is required.\n\nUses 1 run: 100 a day on Standard, 500 on Velocity, reset at midnight UTC.\n\nOn Standard, 1 call every 30 seconds across the Projects endpoints.","tags":["QuickBooks"],"deprecated":true,"parameters":[{"name":"projectId","in":"query","required":false,"description":"QuickBooks' id for the project. Give this or projectName.","schema":{"type":"string"}},{"name":"projectName","in":"query","required":false,"description":"The project's name. Give this or projectId.","schema":{"type":"string"}},{"name":"callbackUrl","in":"query","required":true,"description":"A URL Clickr POSTs the project to when the run finishes.","schema":{"type":"string"}}],"responses":{"200":{"description":"The run was started. Its result comes from Get a run, or is POSTed to statusCallbackUrl.","content":{"application/json":{"schema":{"type":"object","properties":{"receipt":{"type":"string","description":"The id of the run this call started. Pass it to Get a run."}},"required":["receipt"]}}}},"400":{"description":"Must include projectId or projectName in the query string: Neither was given.\n\nMust include callbackUrl in the query string: callbackUrl is missing.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"No API Key provided: The Authorization header is missing.\n\nNo account found for api key provided: The key isn't recognised: mistyped, revoked, or held by someone who has left the account.\n\nNo integration found for account: The account has no connector connected yet.\n\nThis integration is still pending setup…: QuickBooks isn't fully set up in Clickr: its sign-in or two-factor setup is unfinished. The error says what to do.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Forbidden: Your access on the account doesn't include this action.\n\nDaily cap exceeded: The account has used its runs for the day: 100 on Standard, 500 on Velocity. They reset at midnight UTC.\n\nRate limit exceeded: A second call within 30 seconds on Standard. Velocity has no wait.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}},"put":{"operationId":"updateAProjectLegacy","summary":"Update a project","description":"Changes a QuickBooks project's name, customer, status, dates, notes, addresses or custom fields. Only the fields you send change.\n\nFind the project by projectId, or on Velocity by its current name with projectNameIdentifier.\n\nUses 1 run: 100 a day on Standard, 500 on Velocity, reset at midnight UTC.\n\nOn Standard, 1 call every 30 seconds across the Projects endpoints.","tags":["QuickBooks"],"deprecated":true,"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"projectId":{"description":"QuickBooks' id for the project to update. Required unless you give projectNameIdentifier.","type":"string"},"projectNameIdentifier":{"description":"The project's current name, to find it by. Velocity only.","type":"string"},"projectName":{"description":"A new name for the project.","type":"string"},"customerName":{"description":"A different QuickBooks customer for the project.","type":"string"},"projectCode":{"description":"The Project ID field on the QuickBooks project form: your own reference, such as a job number. Not the projectId QuickBooks assigns. Ignored if the form has no Project ID field.","type":"string"},"startDate":{"type":"string","description":"Start date, as MM/DD/YYYY."},"endDate":{"type":"string","description":"End date, as MM/DD/YYYY."},"status":{"type":"string","enum":["not-started","in-progress","completed","canceled","cancelled"],"description":"The project's status. Both spellings of cancelled are accepted."},"notes":{"description":"The project's notes.","type":"string"},"billingAddress":{"description":"The project's billing address.","type":"object","properties":{"country":{"type":"string","description":"Country."},"streetAddress1":{"type":"string","description":"First line of the street address."},"streetAddress2":{"description":"Second line of the street address.","type":"string"},"city":{"type":"string","description":"City."},"state":{"type":"string","description":"State or region."},"zipCode":{"type":"string","description":"ZIP or postal code."}},"required":["country","streetAddress1","city","state","zipCode"]},"shippingAddress":{"description":"The project's shipping address.","type":"object","properties":{"country":{"type":"string","description":"Country."},"streetAddress1":{"type":"string","description":"First line of the street address."},"streetAddress2":{"description":"Second line of the street address.","type":"string"},"city":{"type":"string","description":"City."},"state":{"type":"string","description":"State or region."},"zipCode":{"type":"string","description":"ZIP or postal code."}},"required":["country","streetAddress1","city","state","zipCode"]},"customFields":{"description":"Custom fields to fill on the project form.","type":"array","items":{"type":"object","properties":{"label":{"type":"string","description":"The custom field's name, as it appears on the project form."},"value":{"type":"string","description":"The value to set."},"fieldType":{"type":"string","enum":["text","dropdown"],"description":"Whether the field is free text or a dropdown in QuickBooks."}},"required":["label","value","fieldType"]}},"statusCallbackUrl":{"description":"A URL Clickr POSTs the run's result to when it finishes, as JSON with your metaData. Sent once, with a 30-second timeout.","type":"string"},"metaData":{"description":"Any JSON object of your own, such as your id for the job. Sent back with the result to statusCallbackUrl.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}}},"example":{"projectId":"4821","status":"completed","endDate":"12/18/2026","statusCallbackUrl":"https://example.com/clickr/runs"}}}},"responses":{"200":{"description":"The run was started. Its result comes from Get a run, or is POSTed to statusCallbackUrl.","content":{"application/json":{"schema":{"type":"object","properties":{"receipt":{"type":"string","description":"The id of the run this call started. Pass it to Get a run."}},"required":["receipt"]}}}},"401":{"description":"No API Key provided: The Authorization header is missing.\n\nNo account found for api key provided: The key isn't recognised: mistyped, revoked, or held by someone who has left the account.\n\nNo integration found for account: The account has no connector connected yet.\n\nThis integration is still pending setup…: QuickBooks isn't fully set up in Clickr: its sign-in or two-factor setup is unfinished. The error says what to do.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Forbidden: Your access on the account doesn't include this action.\n\nDaily cap exceeded: The account has used its runs for the day: 100 on Standard, 500 on Velocity. They reset at midnight UTC.\n\nRate limit exceeded: A second call within 30 seconds on Standard. Velocity has no wait.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"429":{"description":"Updating Projects through projectNameIdentifier is not available on your account plan…: projectNameIdentifier was sent on Standard.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"500":{"description":"Failed to update project: The body has no projectId (or projectNameIdentifier), or a field is in the wrong format. The message says which.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/v2/integrations/quickbooks/estimates/convert-to-invoice":{"post":{"operationId":"convertAnEstimateToAnInvoice","summary":"Convert an estimate to an invoice","description":"Turns a QuickBooks estimate into an invoice, in full or in part. Intuit's API has no endpoint for this.\n\nInvoice the whole estimate by sending only txnId. For part of it, send a percentage or an amount, or set each line with lineItems; only one of the three.\n\nUses 1 run: 100 a day on Standard, 500 on Velocity, reset at midnight UTC.\n\nNeeds Estimates on your QuickBooks connector.","tags":["QuickBooks"],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"txnId":{"type":"string","description":"QuickBooks' transaction id for the estimate."},"percentage":{"description":"Invoice this percentage of the estimate, as a number: 50 invoices half. Not with amount or lineItems.","type":"string"},"amount":{"description":"Invoice this amount of the estimate, as a number. Not with percentage or lineItems.","type":"string"},"lineItems":{"description":"Sets invoice lines one by one, each found by its match or, without one, by position. Not with percentage or amount.","type":"array","items":{"type":"object","properties":{"match":{"description":"Names the invoice line this entry fills, instead of its position in the array. Matched exactly, ignoring case. Either every entry has a match or none does, and no two can be the same. Prefer it: a progress invoice carries over only the estimate lines with a balance left, so positions stop lining up once part of an estimate is invoiced.","type":"object","properties":{"productOrService":{"description":"Product or service name of the invoice line to fill.","type":"string"},"description":{"description":"Description of the invoice line to fill.","type":"string"}}},"productOrService":{"description":"Product or service name.","type":"string"},"description":{"description":"The line's description.","type":"string"},"due":{"description":"How much of this line to invoice, where the account uses progress invoicing.","type":"object","properties":{"value":{"type":"string","description":"How much of the line to invoice."},"unit":{"type":"string","enum":["percent","amount"],"description":"Whether value is a percentage or an amount."}},"required":["value","unit"]},"qty":{"description":"Quantity, as a number.","type":"string"},"rate":{"description":"Unit rate, as a number.","type":"string"},"amount":{"description":"The line's total, as a number.","type":"string"}}}},"invoiceNumber":{"description":"The new invoice's number.","type":"string"},"invoiceDate":{"type":"string","description":"Invoice date, as MM/DD/YYYY."},"dueDate":{"type":"string","description":"Due date, as MM/DD/YYYY."},"noteToCustomer":{"description":"The note printed on the invoice.","type":"string"},"memoOnStatement":{"description":"The memo shown on the customer's statement.","type":"string"},"statusCallbackUrl":{"description":"A URL Clickr POSTs the run's result to when it finishes, as JSON with your metaData. Sent once, with a 30-second timeout.","type":"string"},"metaData":{"description":"Any JSON object of your own, such as your id for the job. Sent back with the result to statusCallbackUrl.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["txnId"]},"example":{"txnId":"1187","percentage":"50","invoiceDate":"11/04/2026","dueDate":"12/04/2026","statusCallbackUrl":"https://example.com/clickr/runs"}}}},"responses":{"200":{"description":"The run was started. Its result comes from Get a run, or is POSTed to statusCallbackUrl.","content":{"application/json":{"schema":{"type":"object","properties":{"receipt":{"type":"string","description":"The id of the run this call started. Pass it to Get a run."}},"required":["receipt"]}}}},"401":{"description":"Bad input: The body is missing txnId, combines options that can't go together, or has a field in the wrong format. The message says which.\n\nNo API Key provided: The Authorization header is missing.\n\nNo account found for api key provided: The key isn't recognised: mistyped, revoked, or held by someone who has left the account.\n\nNo integration found for account: The account has no connector connected yet.\n\nThis integration is still pending setup…: QuickBooks isn't fully set up in Clickr: its sign-in or two-factor setup is unfinished. The error says what to do.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Forbidden: Your access on the account doesn't include this action.\n\nOperation not allowed: Estimates isn't on your QuickBooks connector.\n\nDaily cap exceeded: The account has used its runs for the day: 100 on Standard, 500 on Velocity. They reset at midnight UTC.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/v2/integrations/quickbooks/customers/activate":{"post":{"operationId":"activateACustomer","summary":"Activate a customer","description":"Makes an inactive QuickBooks customer active again.\n\nUses 1 credit, whatever the result. Talk to us to add credits.","tags":["QuickBooks"],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"customerId":{"type":"string","description":"QuickBooks' id for the customer to activate."},"statusCallbackUrl":{"description":"A URL Clickr POSTs the run's result to when it finishes, as JSON with your metaData. Sent once, with a 30-second timeout.","type":"string"},"metaData":{"description":"Any JSON object of your own, such as your id for the job. Sent back with the result to statusCallbackUrl.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["customerId"]},"example":{"customerId":"312","statusCallbackUrl":"https://example.com/clickr/runs"}}}},"responses":{"200":{"description":"The run was started. Its result comes from Get a run, or is POSTed to statusCallbackUrl.","content":{"application/json":{"schema":{"type":"object","properties":{"receipt":{"type":"string","description":"The id of the run this call started. Pass it to Get a run."}},"required":["receipt"]}}}},"401":{"description":"No API Key provided: The Authorization header is missing.\n\nNo account found for api key provided: The key isn't recognised: mistyped, revoked, or held by someone who has left the account.\n\nNo integration found for account: The account has no connector connected yet.\n\nThis integration is still pending setup…: QuickBooks isn't fully set up in Clickr: its sign-in or two-factor setup is unfinished. The error says what to do.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Forbidden: Your access on the account doesn't include this action.\n\nInsufficient credits: The account has no credits left for this action.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"500":{"description":"Failed to create project: The run couldn't be started. (The error text is shared with Create a project.)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/v2/events":{"get":{"operationId":"listRuns","summary":"List runs","description":"Returns every run on the account, newest first: QuickBooks actions and the account's other automations.\n\nThe whole history comes back in one response; there are no filters or pages. To follow one action, use Get a run with its receipt.\n\nYou see the runs of the actions your access on the account includes.\n\nNo daily limit.","tags":["Runs"],"parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"events":{"type":"array","items":{"type":"object","properties":{"_id":{"type":"string","description":"The run's id: the receipt its action returned."},"type":{"type":"string","description":"What the run does: createProject, updateProject, getProject, convertEstimateToInvoice or activateCustomer."},"status":{"type":"string","enum":["queued","processing","successful","invalidInput","failed"],"description":"Where the run is. Absent until a worker picks the run up, then processing, then successful, invalidInput (QuickBooks refused the input) or failed. queued appears when a run is retried."},"data":{"description":"What the run did, once it has finished. Its fields depend on the type: see What a run returns.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"createdAt":{"type":"string","description":"When the run was started, in ISO 8601."}},"required":["_id","type","createdAt"]},"description":"The runs, newest first."}},"required":["events"]}}}},"401":{"description":"No API Key provided: The Authorization header is missing.\n\nNo account found for api key provided: The key isn't recognised: mistyped, revoked, or held by someone who has left the account.\n\nNo integration found for account: The account has no connector connected yet.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"500":{"description":"Failed to list events: The runs couldn't be read. Try again.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/v2/events/{id}":{"get":{"operationId":"getARun","summary":"Get a run","description":"Returns one run: its status and, once it has finished, what it did. Pass the receipt a QuickBooks action returned.\n\nA run usually finishes in 3 to 5 minutes. Poll no more than once a minute, or pass a statusCallbackUrl to the action and Clickr will POST the result to you instead.\n\nNo daily limit.","tags":["Runs"],"parameters":[{"name":"id","in":"path","required":true,"description":"The run's id: the receipt from the action.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"event":{"type":"object","properties":{"_id":{"type":"string","description":"The run's id: the receipt its action returned."},"type":{"type":"string","description":"What the run does: createProject, updateProject, getProject, convertEstimateToInvoice or activateCustomer."},"status":{"type":"string","enum":["queued","processing","successful","invalidInput","failed"],"description":"Where the run is. Absent until a worker picks the run up, then processing, then successful, invalidInput (QuickBooks refused the input) or failed. queued appears when a run is retried."},"data":{"description":"What the run did, once it has finished. Its fields depend on the type: see What a run returns.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"createdAt":{"type":"string","description":"When the run was started, in ISO 8601."}},"required":["_id","type","createdAt"]}},"required":["event"]}}}},"401":{"description":"No API Key provided: The Authorization header is missing.\n\nNo account found for api key provided: The key isn't recognised: mistyped, revoked, or held by someone who has left the account.\n\nNo integration found for account: The account has no connector connected yet.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"No event found: No run on the account has this id, or your access doesn't include its action.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}},"500":{"description":"Failed to get event: The id isn't a valid run id.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/v2/account":{"get":{"operationId":"getYourAccount","summary":"Get your account","description":"Returns the account an API key belongs to. A quick way to check a key works.\n\nNo daily limit.","tags":["Account"],"parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"The account's id."},"name":{"type":"string","description":"The account's name."},"email":{"type":"string","description":"The account's email address."}},"required":["id","name","email"]}}}},"401":{"description":"No API Key provided: The Authorization header is missing.\n\nNo account found for api key provided: The key isn't recognised: mistyped, revoked, or held by someone who has left the account.\n\nNo integration found for account: The account has no connector connected yet.\n\nNo account found: The account behind the key no longer exists.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}}},"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"An API key from Settings in Clickr, sent as Authorization: Bearer <key>."}},"schemas":{"BuildertrendSchedules":{"title":"Schedules","description":"Schedule entries with their job, phase, dates and completion.","type":"object","properties":{"scheduleItemId":{"type":"string","description":"Buildertrend's id for the schedule item."},"jobId":{"type":"string","description":"Buildertrend's id for the job the item is on. Joins to the Buildertrend Jobs Dataset."},"jobName":{"type":"string","description":"The job's name in Buildertrend."},"jobColor":{"type":"string","description":"The colour Buildertrend gives the job."},"builderId":{"type":"string","description":"Buildertrend's id for the builder account."},"phaseId":{"type":"string","description":"Buildertrend's id for the schedule phase the item belongs to."},"phaseTitle":{"type":"string","description":"The name of the phase the item belongs to."},"phaseColor":{"type":"string","description":"The colour Buildertrend gives the phase."},"title":{"type":"string","description":"The schedule item's name, the dated line on the job's schedule, such as Dig or Garage Frames."},"color":{"type":"string","description":"The colour Buildertrend gives the item."},"startDate":{"type":"string","description":"When the item starts, as Buildertrend's local wall-clock date and time with no time zone."},"endDate":{"type":"string","description":"When the item ends, as Buildertrend's local wall-clock date and time with no time zone."},"durationWorkdays":{"type":"number","description":"The item's length in working days, counted against the job's workday calendar. It is not endDate minus startDate."},"isHourly":{"type":"boolean","description":"True when the item is scheduled for times of day, false when it is an all-day item."},"isCompleted":{"type":"boolean","description":"Buildertrend's own completed flag for the item, so it is safe to report on. Unlike Tasks, an item that disappears is marked deleted, never complete."},"completedBy":{"type":"string","description":"Who marked the item complete, as Buildertrend records it."},"completedDate":{"type":"string","description":"When the item was marked complete."},"percentComplete":{"type":"number","description":"How far through the item is, as Buildertrend's percent complete."},"assignees":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Buildertrend's id for the assignee."},"name":{"type":"string","description":"The person's or company's name."}},"required":["id","name"]},"description":"The people and companies assigned to the item."},"confirmAcceptedCount":{"type":"number","description":"How many subs/vendors have accepted the item when asked to confirm it."},"confirmPendingCount":{"type":"number","description":"How many subs/vendors have not yet answered a request to confirm the item."},"confirmDeclinedCount":{"type":"number","description":"How many subs/vendors have declined the item when asked to confirm it."},"predecessors":{"type":"array","items":{"type":"object","properties":{"scheduleItemId":{"type":"string","description":"The predecessor's id. Joins to scheduleItemId in this dataset."},"title":{"type":"string","description":"The predecessor's title, copied in so it can be read without a lookup."}},"required":["scheduleItemId","title"]},"description":"The schedule items this one waits on. The dependency type and lag are not included."},"showOwner":{"type":"boolean","description":"Buildertrend's setting for whether the client may see the item."},"notes":{"type":"string","description":"The item's notes, from Buildertrend's All notes field."},"internalNotes":{"type":"string","description":"The item's internal notes, meant for the builder's own staff."},"subNotes":{"type":"string","description":"The item's notes for subs/vendors."},"ownerNotes":{"type":"string","description":"The item's notes for the client, whom Buildertrend calls the owner."},"commentCount":{"type":"number","description":"How many comments the item has."},"rfiCount":{"type":"number","description":"How many RFIs (requests for information) are linked to the item."},"attachedFileCount":{"type":"number","description":"How many files are attached to the item. The files themselves are not in this dataset."},"isDeleted":{"type":"boolean","description":"True once the item has been removed from the schedule in Buildertrend. Clickr keeps the record so you can see it went."},"deletedAt":{"type":"string","format":"date-time","description":"When Clickr saw the item removed. Only items from 3 days ago to 15 days ahead are rechecked, so a removal further out is seen later."}},"required":["scheduleItemId","title"]},"BuildertrendTasks":{"title":"Tasks","description":"Every task across your jobs, with status, due date and completion.","type":"object","properties":{"taskId":{"type":"string","description":"Buildertrend's id for the task."},"jobId":{"type":"string","description":"Buildertrend's id for the job the task belongs to. Joins to the Buildertrend Jobs Dataset."},"jobName":{"type":"string","description":"The name of the task's job in Buildertrend."},"title":{"type":"string","description":"The task's title."},"status":{"type":"string","enum":["Completed","Pending"],"description":"Completed when Buildertrend marks the task complete or isCompleted is true, otherwise Pending. A task that left Buildertrend's open task list reads Completed even if its last code was open."},"assignedUsers":{"type":"array","items":{"type":"string"},"description":"The names of the people assigned to the task."},"dueDate":{"type":"string","description":"When the task is due: Buildertrend's end date for it, as sent."},"notes":{"type":"string","description":"The task's description, as plain text."},"isCompleted":{"type":"boolean","description":"True when the task is completed in Buildertrend, or Clickr saw it leave the open task list and a second check agreed, which also covers a deleted task. False means open as of the last sync."},"completedAt":{"type":"string","format":"date-time","description":"Buildertrend's completion time for a task read as completed. For a task that left the open list, when Clickr noticed, within one sync interval of the change."}},"required":["taskId","title","status"]},"BuildertrendLeads":{"title":"Leads","description":"Lead opportunities with their contact, salesperson, status and estimated revenue.","type":"object","properties":{"leadId":{"type":"string","description":"Buildertrend's id for the lead. Lead activities and lead proposals carry the same id as their leadId."},"builderId":{"type":"string","description":"Buildertrend's id for the builder account the lead belongs to."},"opportunityTitle":{"type":"string","description":"The lead opportunity's title, with leading and trailing spaces removed."},"leadStatus":{"type":"string","enum":["Pending","In progress","On hold","Sold","Lost","No opportunity"],"description":"The lead's status in Buildertrend, as a label. Absent when the lead has no status set."},"confidence":{"type":"number","description":"Buildertrend's confidence figure for the lead, as the number Buildertrend sends."},"proposalStatusCode":{"type":"number","description":"Buildertrend's code for the status of the lead's proposal, taken from its most recent status change. Not mapped to labels."},"proposalStatusUpdatedAt":{"type":"string","description":"When the proposal status last changed, as a date and time with no time zone."},"proposalStatusUpdatedBy":{"type":"string","description":"The name of the person who made the most recent proposal status change."},"salesperson":{"type":"string","description":"The salesperson assigned to the lead, by name."},"source":{"type":"string","description":"Where the lead came from, as recorded in Buildertrend."},"projectType":{"type":"string","description":"The lead's project type, as set in Buildertrend."},"tags":{"type":"array","items":{"type":"string"},"description":"The titles of the tags on the lead."},"contactId":{"type":"string","description":"Buildertrend's id for the lead's contact."},"contactName":{"type":"string","description":"The contact's full name. Usually the only name on the lead, since Buildertrend often leaves firstName and lastName blank."},"firstName":{"type":"string","description":"The contact's first name, when it was entered separately. Often blank even when contactName is set."},"lastName":{"type":"string","description":"The contact's last name, when it was entered separately. Often blank even when contactName is set."},"emails":{"type":"array","items":{"type":"string"},"description":"The contact's email addresses, including any Buildertrend has marked as opted out."},"phone":{"type":"string","description":"The contact's phone number, as entered in Buildertrend."},"cellPhone":{"type":"string","description":"The contact's mobile number, as entered in Buildertrend."},"contactStreet":{"type":"string","description":"The street line of the contact's address."},"contactSuburb":{"type":"string","description":"The suburb line of the contact's address, which Buildertrend uses for non-US addresses."},"contactCity":{"type":"string","description":"The city of the contact's address."},"contactState":{"type":"string","description":"The state of the contact's address."},"contactZip":{"type":"string","description":"The ZIP or postal code of the contact's address."},"opportunityStreet":{"type":"string","description":"The street line of the address where the work is, which can differ from the contact's address."},"opportunitySuburb":{"type":"string","description":"The suburb line of the address where the work is, which Buildertrend uses for non-US addresses."},"opportunityCity":{"type":"string","description":"The city of the address where the work is."},"opportunityState":{"type":"string","description":"The state of the address where the work is."},"opportunityZip":{"type":"string","description":"The ZIP or postal code of the address where the work is."},"estimatedRevenueMin":{"type":"number","description":"The low end of the lead's estimated revenue. Buildertrend sets both ends to the same figure when a single amount was entered."},"estimatedRevenueMax":{"type":"number","description":"The high end of the lead's estimated revenue. Equal to estimatedRevenueMin when a single amount was entered."},"createdDate":{"type":"string","description":"When the lead was created in Buildertrend, as a date and time with no time zone."},"projectedSalesDate":{"type":"string","description":"When the lead is projected to sell, as a date and time with no time zone."},"soldDate":{"type":"string","description":"When the lead was sold, as a date and time with no time zone."},"proposalLastViewed":{"type":"string","description":"When the lead's proposal was last viewed, as a date and time with no time zone."},"mostRecentClick":{"type":"string","description":"When Buildertrend last recorded a link click on the lead, as a date and time with no time zone."},"hasBeenContacted":{"type":"boolean","description":"Whether Buildertrend marks the lead as contacted."},"lastContactedDate":{"type":"string","description":"When the lead was last contacted, as a date and time with no time zone."},"lastContactedBy":{"type":"string","description":"The name of the person who last contacted the lead."},"lastContactedActivityType":{"type":"string","description":"The type of activity used for the last contact, as Buildertrend names it."},"nextActivityDate":{"type":"string","description":"When the lead's next activity is scheduled, as a date and time with no time zone."},"nextActivityTitle":{"type":"string","description":"The category of the lead's next scheduled activity, as Buildertrend names it."},"nextActivityAssignee":{"type":"string","description":"The name of the person assigned to the lead's next activity."},"notes":{"type":"string","description":"The lead's notes, as plain text."},"attachedFileCount":{"type":"number","description":"How many files are attached to the lead."},"linksClicked":{"type":"number","description":"How many links Buildertrend counts as clicked on the lead."},"relatedJobId":{"type":"string","description":"Buildertrend's id for the job the lead converted into, absent until it converts. Joins to the Buildertrend Jobs Dataset."},"relatedJobName":{"type":"string","description":"The name of the job the lead converted into. Absent until it converts."},"isDeleted":{"type":"boolean","description":"True once Buildertrend confirms the lead no longer exists. Clickr keeps the record so you can see it went."},"deletedAt":{"type":"string","format":"date-time","description":"When Clickr saw the lead removed."},"presenceCheckedAt":{"type":"string","format":"date-time","description":"When Clickr last confirmed with Buildertrend that the lead still exists while it sits outside the synced lead list. Cleared when the lead reappears there."}},"required":["leadId"]},"BuildertrendLeadActivities":{"title":"Lead activities","description":"Lead activities with the lead, assigned user, status and contact dates.","type":"object","properties":{"activityId":{"type":"string","description":"Buildertrend's id for the lead activity."},"leadId":{"type":"string","description":"Buildertrend's id for the lead the activity belongs to. Joins to the Buildertrend Leads Dataset."},"leadName":{"type":"string","description":"The title of the lead the activity belongs to, as Buildertrend shows it."},"activityTitle":{"type":"string","description":"The activity's title, such as Call or Site meeting."},"assignedUser":{"type":"string","description":"The name of the Buildertrend user the activity is assigned to."},"activityStatus":{"type":"string","enum":["Completed","Past Due","Pending"],"description":"Past Due or Pending from Buildertrend's own code, or Completed once the activity has left Buildertrend's activity list (see isCompleted)."},"contactDate":{"type":"string","description":"When the activity is scheduled, as Buildertrend's activity list sends it. It moves when the activity is rescheduled."},"lastContactedDate":{"type":"string","description":"The last contacted date Buildertrend shows on the activity's row, as sent."},"lastContactedBy":{"type":"string","description":"The name Buildertrend shows beside the last contacted date on the activity's row."},"notes":{"type":"string","description":"The activity's notes."},"isCompleted":{"type":"boolean","description":"Set by Clickr, not Buildertrend: true once the activity stopped appearing in Buildertrend's activity list. False means no disappearance has been seen, not that the activity is still to do."},"completedAt":{"type":"string","format":"date-time","description":"When Clickr noticed the activity had gone from Buildertrend's activity list, not when anyone completed it."}},"required":["activityId"]},"BuildertrendJobs":{"title":"Jobs","description":"Every job with its status, address and projected start and completion.","type":"object","properties":{"jobId":{"type":"string","description":"Buildertrend's id for the job. Other Buildertrend datasets carry it as jobId, so it is the key to join them on."},"builderId":{"type":"string","description":"Buildertrend's id for the builder, the company account the job belongs to."},"jobName":{"type":"string","description":"The job's name in Buildertrend."},"jobStatus":{"type":"string","enum":["Presale","Open","Warranty","Closed"],"description":"The job's status, named as Buildertrend's own status list names it. Use this rather than status, which is a different code."},"jobColorHex":{"type":"string","description":"The colour assigned to the job in Buildertrend, as a hex code."},"jobPrefix":{"type":"string","description":"The job's prefix, as set on the job in Buildertrend."},"status":{"type":"number","description":"A second, unlabelled status code from Buildertrend's Jobs list. It is not the same code as jobStatus, so read jobStatus for the job's status."},"jobType":{"type":"string","description":"The job's type, as Buildertrend's Jobs list shows it. detail.jobType carries it with its id."},"contractType":{"type":"string","description":"The job's contract type, such as Fixed Price or Open Book."},"groups":{"type":"array","items":{"type":"string"},"description":"The names of the job groups the job is in."},"workTemplate":{"type":"string","description":"The work template Buildertrend's Jobs list shows for the job."},"lot":{"type":"string","description":"The lot recorded on the job in Buildertrend."},"permit":{"type":"string","description":"The permit recorded on the job in Buildertrend."},"street":{"type":"string","description":"The job site's street address."},"city":{"type":"string","description":"The job site's city."},"state":{"type":"string","description":"The job site's state."},"zip":{"type":"string","description":"The job site's zip code."},"suburb":{"type":"string","description":"The job site's suburb. Buildertrend uses it for Australian addresses."},"mappingData":{"description":"Buildertrend's map data for the job site as it sends it, with the geocoding status and the coordinates."},"latitude":{"type":"number","description":"The job site's latitude, from Buildertrend's map data."},"longitude":{"type":"number","description":"The job site's longitude, from Buildertrend's map data."},"contacts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Buildertrend's id for the client contact."},"name":{"type":"string","description":"The client's name."},"phone":{"type":"string","description":"The client's phone number, as entered in Buildertrend."},"email":{"type":"string","description":"The client's email address."},"street":{"type":"string","description":"The client's street address."},"city":{"type":"string","description":"The client's city."},"state":{"type":"string","description":"The client's state."},"zip":{"type":"string","description":"The client's zip code."},"suburb":{"type":"string","description":"The client's suburb. Buildertrend uses it for Australian addresses."}}},"description":"The job's clients, one entry per client with their contact details."},"projectManager":{"type":"array","items":{"type":"string"},"description":"The names of the job's project managers."},"createdBy":{"description":"Who created the job, as Buildertrend sends it."},"statusLastUpdatedBy":{"type":"string","description":"The name of whoever last changed the job's status."},"createdDate":{"description":"When the job was created, as Buildertrend sends it."},"projectedStart":{"description":"The job's projected start date, as Buildertrend sends it."},"projectedCompletion":{"description":"The job's projected completion date, as Buildertrend sends it."},"actualStart":{"description":"The job's actual start date, as Buildertrend sends it."},"actualCompletion":{"description":"The job's actual completion date, as Buildertrend sends it."},"statusLastUpdatedDate":{"description":"When the job's status last changed, as Buildertrend sends it."},"warranty":{"description":"The job's warranty value from Buildertrend's Jobs list, as sent."},"contractPrice":{"description":"The job's contract price, as Buildertrend's Jobs list sends it. detail.contractPrice has it as a plain number."},"approvedCOPrice":{"description":"The total of the job's approved change orders, as Buildertrend sends it."},"jobRunningTotal":{"description":"The job's running total, as Buildertrend sends it."},"paymentsReceived":{"description":"The payments received on the job, as Buildertrend sends them."},"ownerBalance":{"description":"The balance the client still owes on the job, as Buildertrend sends it."},"appliedCreditMemos":{"description":"The credit memos applied to the job, as Buildertrend sends them."},"allowanceDifference":{"description":"The job's allowance difference, as Buildertrend sends it."},"totalCost":{"description":"The job's total cost, as Buildertrend sends it."},"costsPaid":{"description":"The job's costs paid so far, as Buildertrend sends them."},"costsOutstanding":{"description":"The job's costs still outstanding, as Buildertrend sends them."},"grossProfit":{"description":"The job's gross profit, as Buildertrend sends it."},"originalBudgetCosts":{"description":"The job's original budgeted costs, as Buildertrend sends them."},"revisedBudgetCosts":{"description":"The job's revised budgeted costs, as Buildertrend sends them."},"amountInvoiced":{"description":"The amount invoiced on the job, as Buildertrend sends it."},"projectedCosts":{"description":"The job's projected costs, as Buildertrend sends them."},"projectedProfit":{"description":"The job's projected profit, as Buildertrend sends it."},"individualPOLimit":{"description":"The limit on a single purchase order for the job, as Buildertrend's Jobs list sends it. detail.individualPOLimit has it as a plain number."},"overallPOLimit":{"description":"The limit on the job's purchase orders overall, as Buildertrend sends it."},"costRate":{"description":"The job's cost rate, as Buildertrend's object holding a cost and a unit."},"priceRate":{"description":"The job's price rate, as Buildertrend's object holding a cost and a unit."},"totalArea":{"description":"The job's total area, as Buildertrend's object holding a value and a unit. detail.totalArea has the number alone."},"creditCardTransactionLimit":{"description":"Whether the job takes online card payments, with the minimum and maximum amounts, as Buildertrend's object."},"achTransactionLimit":{"description":"Whether the job takes online ACH bank payments, with the minimum and maximum amounts, as Buildertrend's object."},"accountingStatus":{"type":"number","description":"Buildertrend's unlabelled code for the job's accounting link. detail.accounting says whether the job is linked and whether a sync is queued."},"isScheduleOnline":{"type":"boolean","description":"Whether the job's schedule is set online in Buildertrend."},"takeoffStatus":{"type":"boolean","description":"Buildertrend's takeoff flag for the job."},"ownerActivationStatus":{"type":"number","description":"Buildertrend's code for the client's portal activation on the job. Its labels have not been confirmed."},"customFields":{"description":"The job's custom field values from Buildertrend's Jobs list, as sent. detail.customFields carries each one with its title and type."},"subNotes":{"type":"string","description":"The job's notes for subs, which subcontractors can see."},"lastSeenScope":{"type":"string","enum":["allJobs","openJobs"],"description":"Which read last confirmed the job: allJobs, a read of every job, or openJobs, the routine read of open jobs only."},"lastSeenAt":{"type":"string","format":"date-time","description":"When Clickr last saw the job in a read from Buildertrend."},"detail":{"type":"object","properties":{"jobStatus":{"type":"object","properties":{"id":{"type":"number","description":"Buildertrend's status code: 0 Closed, 1 Open, 3 Presale, 4 Warranty."},"name":{"type":"string","description":"The status's name, such as Open."}},"description":"The job's status, with its Buildertrend code."},"jobType":{"type":"object","properties":{"id":{"type":"number","description":"Buildertrend's id for the job type."},"name":{"type":"string","description":"The job type's name."}},"description":"The job's type, with its Buildertrend id."},"contractType":{"type":"object","properties":{"id":{"type":"number","description":"Buildertrend's id for the contract type."},"name":{"type":"string","description":"The contract type's name, such as Fixed Price or Open Book."}},"description":"The job's contract type, with its Buildertrend id."},"jobGroups":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","description":"Buildertrend's id for the job group."},"name":{"type":"string","description":"The job group's name."}}},"description":"The job groups the job is in, with their ids."},"jobColor":{"type":"object","properties":{"id":{"type":"number","description":"Buildertrend's id for the colour."},"name":{"type":"string","description":"The colour's name in Buildertrend's palette."},"hex":{"type":"string","description":"The colour as a hex code, such as #FF9600."}},"description":"The colour assigned to the job."},"projectManagers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","description":"Buildertrend's user id for the project manager."},"name":{"type":"string","description":"The project manager's name."}}},"description":"The job's project managers, with their ids."},"internalNotes":{"type":"string","description":"Notes on the job for the builder's own staff only. Subs do not see them."},"jobsitePrefix":{"type":"string","description":"The job's prefix, from the job's own record in Buildertrend."},"dateOpened":{"type":"string","description":"When the job was opened, as a date and time with no time zone."},"openedBy":{"type":"object","properties":{"id":{"type":"number","description":"Buildertrend's user id for the person who opened the job."},"name":{"type":"string","description":"The name of the person who opened the job."}},"description":"Who opened the job."},"scheduleStart":{"type":"string","description":"The start of the job's schedule, which Buildertrend works out from its schedule items. Absent when the job has none."},"scheduleEnd":{"type":"string","description":"The end of the job's schedule, which Buildertrend works out from its schedule items. Absent when the job has none."},"hasScheduleItems":{"type":"boolean","description":"Whether the job has any schedule items."},"syncActualStartEnd":{"type":"boolean","description":"Buildertrend's setting for syncing the job's actual start and end, as sent."},"workDays":{"type":"array","items":{"type":"string"},"description":"The days of the week the job works, such as Monday, in Buildertrend's order with Sunday first."},"mappingStatus":{"type":"number","description":"Buildertrend's geocoding status code for the job site."},"pinType":{"type":"number","description":"Buildertrend's map pin type code for the job site."},"enableGeofencing":{"type":"boolean","description":"Whether geofencing is turned on for the job."},"includeTimeClockForCosts":{"type":"boolean","description":"Whether time clock entries count towards the job's costs."},"includeTimeClockForBudget":{"type":"boolean","description":"Whether time clock entries count towards the job's budget."},"includeAllowances":{"type":"boolean","description":"Whether the job includes allowances."},"updateRunningTotalForSelection":{"type":"boolean","description":"Whether selections update the job's running total."},"notifyProjectManager":{"type":"boolean","description":"Whether the job's notify project manager setting is on."},"isTemplate":{"type":"boolean","description":"Whether the job is saved as a template."},"templateName":{"type":"string","description":"The template name Buildertrend holds on the job."},"contractPrice":{"type":"number","description":"The job's contract price as a plain number, in the account's currency."},"individualPOLimit":{"type":"number","description":"The most a single purchase order on the job may be for, in the account's currency. Absent when no limit is set."},"totalPOLimit":{"type":"number","description":"The total purchase order limit for the job, in the account's currency. Absent when no limit is set."},"totalArea":{"type":"number","description":"The job's total area as a plain number, in the unit the account uses, such as square feet."},"defaultTaxGroupId":{"type":"number","description":"Buildertrend's id for the job's default tax group."},"customFields":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number","description":"Buildertrend's id for the custom field."},"title":{"type":"string","description":"The custom field's name."},"type":{"type":"string","description":"The custom field's type, such as MultiLineText."},"value":{"description":"The custom field's value on this job, as Buildertrend sends it."},"onOwnerPortal":{"type":"boolean","description":"Whether the custom field is shown on the client portal."}}},"description":"The job's custom fields, each with its title, type and value."},"financialSettings":{"description":"The job's financial settings as Buildertrend sends them: markup and margin defaults, draw schedule, tax version and budget display preferences."},"lead":{"type":"object","properties":{"leadId":{"type":"number","description":"Buildertrend's id for that lead. Joins to the Buildertrend Leads Dataset, where it is a string."},"leadTitle":{"type":"string","description":"The lead's title."},"leadStatus":{"type":"number","description":"Buildertrend's status code for the lead."},"leadAddedByUser":{"type":"string","description":"The name of the user who added the lead."},"leadAddedByDate":{"type":"string","description":"When the lead was added, as a date and time with no time zone."}},"description":"The lead the job was converted from. Absent when the job did not come from a lead."},"accounting":{"type":"object","properties":{"linkedToAccounting":{"type":"boolean","description":"Whether the job is linked to the accounting system."},"inPendingSync":{"type":"boolean","description":"Whether a sync to the accounting system is queued for the job."},"integrationType":{"type":"number","description":"Buildertrend's code for which accounting system the job is linked to."},"message":{"type":"string","description":"Buildertrend's accounting message for the job, when it has one."}},"description":"The job's link to the accounting system connected to Buildertrend."},"ownerInfo":{"description":"The job's client portal settings as Buildertrend sends them: what the client can see and pay."}},"description":"Fields only the job's own record in Buildertrend carries, fetched one job at a time. Absent until fetched, which is normal for a closed job."},"detailSyncedAt":{"type":"string","format":"date-time","description":"When Clickr last fetched the job's detail."},"isDeleted":{"type":"boolean","description":"True once the job has been removed in Buildertrend, checked against a read of every job so a job that only closed is not marked. Clickr keeps the record so you can see it went."},"deletedAt":{"type":"string","format":"date-time","description":"When Clickr saw the job removed."}},"required":["jobId"]},"BuildertrendChangeOrders":{"title":"Change orders","description":"Change orders with their job, client, approval status and amounts.","type":"object","properties":{"changeOrderId":{"type":"string","description":"Buildertrend's id for the change order, unique across the account."},"coNumber":{"type":"string","description":"The change order number the builder typed, for example #003 or 0052, with surrounding spaces trimmed. It is neither unique nor consistently formatted."},"builderId":{"type":"string","description":"Buildertrend's id for the builder account the change order belongs to."},"jobId":{"type":"string","description":"Buildertrend's id for the change order's job. Joins to the Buildertrend Jobs Dataset."},"jobName":{"type":"string","description":"The name of the change order's job, as Buildertrend shows it."},"ownerName":{"type":"string","description":"The client the change order is addressed to, as Buildertrend shows the name."},"title":{"type":"string","description":"The change order's title."},"approvalStatus":{"type":"number","description":"Buildertrend's approval status code. Codes seen so far are 0 Draft, 1 Pending, 3 Approved, 4 Approved and 5 Declined, so read approvalStatusText for the label."},"approvalStatusText":{"type":"string","description":"Buildertrend's own label for the approval status, for example Draft, Pending, Approved or Declined."},"statusChangedDate":{"type":"string","description":"When the status last changed, in the account's own time zone. On a draft it is the creation date, and declined change orders carry one too, so it is not an approval date."},"statusChangedBy":{"type":"string","description":"The name of the person who last changed the status. Absent on a draft."},"builderCost":{"type":"number","description":"The builder's cost for the change order, in the account's own currency."},"subtotal":{"type":"number","description":"The change order's subtotal, from Buildertrend's Subtotal column."},"totalPrice":{"type":"number","description":"The change order's total price, from Buildertrend's Total price column."},"totalMarkup":{"type":"number","description":"The total markup on the change order."},"purchaseOrderCost":{"type":"number","description":"The cost of the purchase orders raised against the change order."},"poCustomerVariance":{"type":"number","description":"Buildertrend's PO customer variance: one of 2 variances it reports between purchaseOrderCost and what was quoted."},"poBuilderVariance":{"type":"number","description":"Buildertrend's PO builder variance: one of 2 variances it reports between purchaseOrderCost and what was quoted."},"percentInvoiced":{"type":"number","description":"How much of the change order has been invoiced, as a percentage."},"dateAdded":{"type":"string","description":"When the change order was created, in the account's own time zone."},"deadline":{"type":"string","description":"The change order's deadline."},"ownerLastViewed":{"type":"string","description":"When the client last opened the change order."},"createdBy":{"type":"string","description":"The name of the person who created the change order, when Buildertrend sends it."},"createdById":{"type":"string","description":"Buildertrend's user id for the person who created the change order."},"relatedPurchaseOrderIds":{"type":"array","items":{"type":"string"},"description":"The purchase orders raised against this change order. Each matches purchaseOrderId in the Buildertrend Purchase Orders Dataset."},"isInvoiceable":{"type":"boolean","description":"Whether the change order can be turned into an owner invoice."},"attachedFileCount":{"type":"number","description":"How many files are attached to the change order."},"commentCount":{"type":"number","description":"How many comments the change order has."},"rfiCount":{"type":"number","description":"How many RFIs (requests for information) the change order has."},"isDeleted":{"type":"boolean","description":"True once the change order has been removed in Buildertrend. Clickr keeps the record so you can see it went."},"deletedAt":{"type":"string","format":"date-time","description":"When Clickr saw the change order removed."}},"required":["changeOrderId"]},"BuildertrendEstimates":{"title":"Estimates","description":"Estimate line items with their job, cost code, quantities, cost and owner price.","type":"object","properties":{"lineItemId":{"type":"string","description":"Buildertrend's id for the estimate line item. Unique across the account, not just within a job."},"jobId":{"type":"string","description":"Buildertrend's id for the job the estimate belongs to. Joins to the Buildertrend Jobs Dataset."},"worksheetId":{"type":"string","description":"Buildertrend's id for the job's estimate worksheet. Repeated on every line item of the job."},"builderId":{"type":"string","description":"Buildertrend's id for the builder account the line item belongs to."},"jobName":{"type":"string","description":"The job's name. Repeated on every line item of the job."},"contractPrice":{"type":"number","description":"The contract price on the job's estimate worksheet, in the account's currency. Repeated on every line item, and editing it alone does not fire pipelines watching line items."},"proposalStatus":{"type":"number","description":"Buildertrend's code for the status of the owner proposal built from this worksheet, repeated on every line item of the job. Not mapped to labels."},"worksheetLocked":{"type":"boolean","description":"Whether the estimate worksheet is locked. It can flip when someone simply opens the worksheet, so it alone does not fire pipelines watching line items."},"isSentToBudget":{"type":"boolean","description":"Whether the estimate worksheet has been sent to the job's budget. Repeated on every line item of the job."},"groupId":{"type":"string","description":"Buildertrend's id for the worksheet group the line sits in. -1 is Buildertrend's catch-all Unassigned group."},"groupTitle":{"type":"string","description":"The title of the group the line sits in. Unassigned is Buildertrend's catch-all group, not one an estimator created."},"groupPath":{"type":"array","items":{"type":"string"},"description":"The titles of the groups from the top of the worksheet down to this line's group, which tells apart subgroups with the same name."},"itemTitle":{"type":"string","description":"The line item's title."},"description":{"type":"string","description":"The line item's description."},"internalNotes":{"type":"string","description":"Builder-only notes on the line. Buildertrend can fill this with the cost category label, so it is not always text an estimator typed."},"lineItemType":{"type":"number","description":"Buildertrend's code for the kind of line item. Not mapped to labels."},"parentId":{"type":"string","description":"Buildertrend's id for the line item's parent, when it has one."},"costCodeId":{"type":"string","description":"Buildertrend's id for the line's cost code."},"costCodeTitle":{"type":"string","description":"The name of the line's cost code."},"costCategoryId":{"type":"string","description":"Buildertrend's id for the line's cost category."},"costCategoryName":{"type":"string","description":"The name of the line's cost category, looked up from the worksheet's list of cost categories."},"costItemId":{"type":"string","description":"Buildertrend's id for the line's cost item."},"costTypes":{"description":"Buildertrend's split of the line by cost type, such as labour, material or subcontractor, passed through as Buildertrend sends it."},"unit":{"type":"string","description":"The unit of measure for the quantity, as entered in Buildertrend."},"quantity":{"type":"number","description":"How many units the line covers."},"unitCost":{"type":"number","description":"The builder's cost per unit, in the account's currency."},"builderCost":{"type":"number","description":"The line's total cost to the builder, quantity times unit cost, in the account's currency."},"markupType":{"type":"number","description":"Buildertrend's code for which kind of markup the estimator entered: a percentage, a per-unit amount or a flat amount. The other markup fields are worked out from it."},"markupPercent":{"type":"number","description":"The markup as a percentage of cost, so 20 means 20%."},"markupPerUnit":{"type":"number","description":"The markup per unit, in the account's currency."},"markupAmount":{"type":"number","description":"The line's total markup, in the account's currency."},"margin":{"type":"number","description":"The line's margin as a percentage of the owner price, so 16.67 means 16.67%."},"unitPrice":{"type":"number","description":"The owner price per unit, in the account's currency."},"ownerPrice":{"type":"number","description":"The price the owner is charged for the line, cost plus markup, in the account's currency."},"amountInvoiced":{"type":"number","description":"How much has been invoiced against the line so far, in the account's currency."},"retainageWithheld":{"type":"number","description":"The retainage withheld on the line, in the account's currency."},"taxGroupId":{"type":"string","description":"Buildertrend's id for the tax group applied to the line."},"totalWithTax":{"type":"number","description":"The line's total including tax, in the account's currency, as Buildertrend calculates it."},"hasRelatedPurchaseOrder":{"type":"boolean","description":"Whether the line is already on a purchase order."},"relatedPurchaseOrderLineItemId":{"type":"string","description":"Buildertrend's id for the purchase order line item linked to this line."},"relatedItems":{"description":"Buildertrend's links from this line to related items, passed through as Buildertrend sends them."},"selectionOptionGroupId":{"type":"string","description":"Buildertrend's id for the selection option group linked to this line."},"assemblyId":{"type":"string","description":"Buildertrend's id for the assembly the line belongs to."},"takeoffLineItemId":{"type":"string","description":"Buildertrend's id for the takeoff line item linked to this line."},"importedFromProposalFormatItemId":{"type":"string","description":"Buildertrend's id for the proposal format item this line was imported from."},"productId":{"type":"string","description":"Buildertrend's id for the product, on lines added from a supplier catalogue."},"productUrl":{"type":"string","description":"A link to the product, on lines added from a supplier catalogue."},"productLink":{"description":"Buildertrend's product link details, passed through as sent. Present only on lines added from a supplier catalogue."},"vendorType":{"type":"number","description":"Buildertrend's code for the catalogue vendor type, on lines added from a supplier catalogue. Not mapped to labels."},"discontinued":{"type":"boolean","description":"Whether the catalogue product is marked discontinued, on lines added from a supplier catalogue."},"markedAs":{"type":"number","description":"Buildertrend's code for how the line is marked. Not mapped to labels."},"formatId":{"type":"string","description":"Buildertrend's id for the line's entry in the worksheet layout."},"displayOrder":{"type":"number","description":"The line's position within its group on the worksheet."},"dateAdded":{"type":"string","description":"When the line was added to the worksheet, as the date string Buildertrend sends."},"isDeleted":{"type":"boolean","description":"True once the line has been removed from the job's estimate in Buildertrend, and Clickr keeps the record. Only open jobs are rechecked, so a line on a closed job keeps its last state."},"deletedAt":{"type":"string","format":"date-time","description":"When Clickr saw the line removed."}},"required":["lineItemId","jobId"]},"BuildertrendPurchaseOrders":{"title":"Purchase orders","description":"Purchase orders with their job, sub/vendor, approval and payment status, and cost.","type":"object","properties":{"purchaseOrderId":{"type":"string","description":"Buildertrend's id for the purchase order, unique across the account."},"poNumber":{"type":"string","description":"The PO number shown in Buildertrend, such as PO-P0259-2459."},"externalId":{"type":"string","description":"An external identifier Buildertrend sends with the purchase order."},"builderId":{"type":"string","description":"Buildertrend's id for the builder account."},"jobId":{"type":"string","description":"Buildertrend's id for the job the purchase order is on. Joins to the Buildertrend Jobs Dataset."},"jobName":{"type":"string","description":"The job's name in Buildertrend."},"title":{"type":"string","description":"The purchase order's title, which says what was bought."},"hasAmendment":{"type":"boolean","description":"Whether Buildertrend marks the purchase order as amended."},"approvalStatus":{"type":"number","description":"Buildertrend's code for where the purchase order sits between the builder and the sub/vendor. No vocabulary is published, so read approvalStatusText."},"approvalStatusText":{"type":"string","description":"Buildertrend's own label for the approval status, such as Draft."},"approvalNote":{"type":"string","description":"Additional information Buildertrend shows with the approval status."},"approvalUser":{"type":"string","description":"Who the purchase order currently sits with, the sub/vendor once it has been sent. Absent on a draft."},"isRecalled":{"type":"boolean","description":"Whether Buildertrend marks the purchase order as recalled."},"workStatus":{"type":"number","description":"Buildertrend's code for whether the work is done, which is independent of approval and payment. Read workStatusText for the label."},"workStatusText":{"type":"string","description":"Buildertrend's own label for the work status, such as Not Complete."},"paidStatus":{"type":"number","description":"Buildertrend's code for the payment status. Read paidStatusText for the label."},"paidStatusText":{"type":"string","description":"Buildertrend's own label for the payment status, such as Not Paid or Paid."},"paymentRequested":{"type":"boolean","description":"True when the sub/vendor has asked to be paid. It does not mean the builder has paid."},"cost":{"type":"number","description":"The purchase order's cost, in the account's own currency (351.7 means 351.70)."},"amountPaid":{"type":"number","description":"How much has been paid against the purchase order."},"amountRemaining":{"type":"number","description":"How much of the purchase order's cost is still unpaid."},"percentPaid":{"type":"number","description":"Buildertrend's percentage of the purchase order that has been paid."},"percentRemaining":{"type":"number","description":"Buildertrend's percentage of the purchase order that is still unpaid."},"percentBilled":{"type":"number","description":"Buildertrend's percentage of the purchase order that has been billed."},"performingUserName":{"type":"string","description":"The sub/vendor the purchase order is issued to."},"performingUserId":{"type":"string","description":"Buildertrend's id for the sub/vendor the purchase order is issued to."},"costCodes":{"type":"array","items":{"type":"string"},"description":"The purchase order's cost codes as Buildertrend displays them, each a code followed by its name, not ids."},"builderVarianceCodes":{"type":"array","items":{"type":"string"},"description":"The builder variance codes on the purchase order, as Buildertrend displays them rather than ids."},"ownerVarianceCodes":{"type":"array","items":{"type":"string"},"description":"The owner variance codes on the purchase order, as Buildertrend displays them rather than ids."},"estCompleteDate":{"type":"string","description":"The estimated completion date for the purchase order's work."},"dateAdded":{"type":"string","description":"When the purchase order was added in Buildertrend."},"dateLastModified":{"type":"string","description":"When the purchase order was last edited. Absent if it has never been edited."},"createdBy":{"type":"string","description":"The name of the Buildertrend user who created the purchase order."},"createdById":{"type":"string","description":"Buildertrend's user id for whoever created the purchase order."},"fromEstimate":{"type":"boolean","description":"Whether the purchase order was created from an estimate."},"isBill":{"type":"boolean","description":"True when the purchase order has been turned into a bill."},"isOriginatedFromAccounting":{"type":"boolean","description":"True when the purchase order originated in the accounting system rather than in Buildertrend."},"attachedFileCount":{"type":"number","description":"How many files are attached to the purchase order. The files themselves are not in this dataset."},"commentCount":{"type":"number","description":"How many comments the purchase order has."},"rfiCount":{"type":"number","description":"How many RFIs (requests for information) are linked to the purchase order."},"isDeleted":{"type":"boolean","description":"True once the purchase order has been deleted in Buildertrend, never because the work finished. Clickr keeps the record so you can see it went."},"deletedAt":{"type":"string","format":"date-time","description":"When Clickr saw the purchase order removed."}},"required":["purchaseOrderId"]},"BuildertrendDailyLogs":{"title":"Daily logs","description":"Field crew site-visit entries with their job, notes, weather and location.","type":"object","properties":{"dailyLogId":{"type":"string","description":"Buildertrend's id for the daily log."},"externalId":{"type":"string","description":"An external id Buildertrend sends with the log."},"builderId":{"type":"string","description":"Buildertrend's id for the builder account the log belongs to."},"jobId":{"type":"string","description":"Buildertrend's id for the log's job. Joins to the Buildertrend Jobs Dataset."},"jobName":{"type":"string","description":"The name of the log's job, as Buildertrend shows it."},"logDate":{"type":"string","description":"When the log entry is dated, in the jobsite's local time with no time zone, for example 2026-08-21T13:31:00."},"title":{"type":"string","description":"The log's title. Absent when the log has none."},"notes":{"type":"string","description":"The notes written on the log."},"addedById":{"type":"string","description":"Buildertrend's user id for the person who added the log."},"addedByName":{"type":"string","description":"The name of the person who added the log."},"addedByDateUtc":{"type":"string","description":"When the log was added, in UTC. The value carries no Z or offset, so treat it as UTC rather than local time."},"updatedById":{"type":"string","description":"Buildertrend's user id for the person who last updated the log."},"updatedByDateUtc":{"type":"string","description":"When the log was last updated, in UTC. The value carries no Z or offset, so treat it as UTC rather than local time."},"viewableBySubs":{"type":"boolean","description":"Whether the log is visible to subs and vendors in Buildertrend."},"viewableByOwner":{"type":"boolean","description":"Whether the log is visible to the client in Buildertrend."},"viewableByInternalUsers":{"type":"boolean","description":"Whether the log is visible to the builder's internal users in Buildertrend."},"coordinate":{"type":"object","properties":{"latitude":{"type":"number","description":"Latitude of the location recorded with the log, in decimal degrees."},"longitude":{"type":"number","description":"Longitude of the location recorded with the log, in decimal degrees."}},"description":"The location recorded with the log. This is the log's own position, not the weather station's.","required":["latitude","longitude"]},"isLocationTrackingEnabled":{"type":"boolean","description":"Buildertrend's location tracking flag for the log."},"weatherNotes":{"type":"string","description":"The weather notes written on the log."},"weather":{"type":"object","properties":{"conditions":{"type":"string","description":"The conditions in words, for example Partly Cloudy with Thunderstorms."},"maxTemp":{"type":"number","description":"The high temperature in the log's weather reading. Buildertrend sends no unit with it."},"minTemp":{"type":"number","description":"The low temperature in the log's weather reading. Buildertrend sends no unit with it."},"maxWindSpeed":{"type":"number","description":"The highest wind speed in the log's weather reading. Buildertrend sends no unit with it."},"maxWindGust":{"type":"number","description":"The strongest wind gust in the log's weather reading. Buildertrend sends no unit with it."},"precip":{"type":"number","description":"The precipitation in the log's weather reading. Buildertrend sends no unit with it."},"maxHumidity":{"type":"number","description":"The highest humidity in the log's weather reading."},"minHumidity":{"type":"number","description":"The lowest humidity in the log's weather reading."},"heatIndex":{"type":"number","description":"The heat index in the log's weather reading, when Buildertrend sends one."},"windChill":{"type":"number","description":"The wind chill in the log's weather reading, when Buildertrend sends one."}},"description":"The weather reading Buildertrend attached to the log, with each figure as a number."},"tags":{"type":"array","description":"The tags applied to the log, as Buildertrend sends them. Absent when the log has none."},"customFields":{"type":"array","description":"The account's custom fields on the log, as Buildertrend sends them. Absent when there are none."},"commentCount":{"type":"number","description":"How many comments the log has."},"hasDocs":{"type":"boolean","description":"Whether anything is attached to the log. Equivalent to files being non-empty, and kept because it can be filtered on where files cannot."},"files":{"type":"array","items":{"type":"object","properties":{"fileId":{"type":"string","description":"Buildertrend's id for the file."},"title":{"type":"string","description":"The file's name as uploaded, extension included."},"extension":{"type":"string","description":"The file's extension, for example jpeg."},"isPhoto":{"type":"boolean","description":"Whether Buildertrend treats the file as a photo."},"sizeInBytes":{"type":"number","description":"The file's size in bytes."},"addedBy":{"type":"string","description":"The name of the person who attached the file."},"dateAttached":{"type":"string","description":"When the file was attached."},"lastModifiedOn":{"type":"string","description":"When the file was last modified."},"jobId":{"type":"string","description":"Buildertrend's id for the job the file belongs to. It has matched the log's jobId in every case seen so far."},"rowVersion":{"type":"string","description":"Buildertrend's version marker for the file, which changes when the file does."},"downloadUrl":{"type":"string","description":"A link to download the file that needs no API key. It is made fresh each time the record is read and expires 1 hour later, so read the record again rather than storing it."}},"required":["fileId"]},"description":"The photos and documents attached to the log, one entry per file, sorted by fileId. Absent when the log has none."},"status":{"type":"number","description":"Buildertrend's status code for the log. It has been 0 on every log seen so far, so no labels are published for it."},"isDeleted":{"type":"boolean","description":"True once the log has been removed in Buildertrend. Clickr keeps the record so you can see it went."},"deletedAt":{"type":"string","format":"date-time","description":"When Clickr saw the log removed."}},"required":["dailyLogId"]},"BuildertrendInvoices":{"title":"Invoices","description":"Owner invoices the builder bills its clients, with amounts, tax, retainage, what has been paid and what is still owed.","type":"object","properties":{"invoiceId":{"type":"string","description":"Buildertrend's id for the invoice, unique across the account."},"invoiceNumber":{"type":"string","description":"The invoice number shown in Buildertrend, such as 0833-0001."},"builderId":{"type":"string","description":"Buildertrend's id for the builder account."},"jobId":{"type":"string","description":"Buildertrend's id for the job the invoice is on. Joins to the Buildertrend Jobs Dataset."},"jobName":{"type":"string","description":"The job's name in Buildertrend."},"ownerName":{"type":"string","description":"The client being billed, whom Buildertrend calls the owner."},"title":{"type":"string","description":"The invoice's title, a short free-text label such as Down Payment."},"invoiceAmount":{"type":"number","description":"The invoice total, in the account's own currency (351.7 means 351.70)."},"totalTax":{"type":"number","description":"The tax on the invoice."},"retainage":{"type":"number","description":"The portion of invoiceAmount withheld until the work is accepted. Part of the invoice, not an extra charge on top of it."},"amountPaid":{"type":"number","description":"What has been received against the invoice, net of refunds. Not the invoice total, which is invoiceAmount."},"invoiceBalance":{"type":"number","description":"What is still owed on the invoice. The field to read to tell whether an invoice is settled."},"amountRefunded":{"type":"number","description":"How much has been refunded on the invoice."},"paymentStatusType":{"type":"number","description":"Buildertrend's payment-status code, sent with no label and not a published vocabulary. To tell whether the invoice is settled, read invoiceBalance."},"hasPaymentProcessing":{"type":"boolean","description":"True while a payment on the invoice is being processed."},"hasPaymentIssue":{"type":"boolean","description":"True when a payment on the invoice has hit a problem."},"isInApproval":{"type":"boolean","description":"True while the invoice is waiting on an approver."},"isRejected":{"type":"boolean","description":"True when an approver has refused the invoice."},"scheduledReleaseDate":{"type":"string","description":"The scheduled release date Buildertrend shows in the invoice's payment status."},"dueDate":{"type":"string","description":"The date the invoice is due."},"viewedByOwnerOn":{"type":"string","description":"When the client last opened the invoice in Buildertrend's owner portal. Absent means they have not opened it, not that it was never sent."},"datePaid":{"type":"string","description":"The paid date Buildertrend shows for the invoice. To tell whether it is settled, read invoiceBalance."},"dateReleased":{"type":"string","description":"The invoice's release date as Buildertrend reports it."},"createdDate":{"type":"string","description":"When the invoice was created in Buildertrend."},"createdBy":{"type":"string","description":"The name of the Buildertrend user who created the invoice."},"createdById":{"type":"string","description":"Buildertrend's user id for whoever created the invoice."},"accountingStatus":{"type":"number","description":"Buildertrend's code from its QuickBooks column for the invoice. Its values are not documented, so treat it as a code rather than a status."},"isPendingSync":{"type":"boolean","description":"True while the invoice is waiting its turn to sync to the accounting system."},"isOriginatedFromAccounting":{"type":"boolean","description":"True when the invoice was created in the accounting system rather than in Buildertrend."},"attachedFileCount":{"type":"number","description":"How many files are attached to the invoice. The files themselves are not in this dataset."},"commentCount":{"type":"number","description":"How many comments the invoice has."},"isDeleted":{"type":"boolean","description":"True once the invoice has been voided or deleted in Buildertrend, never because it was paid. Clickr keeps the record so you can see it went."},"deletedAt":{"type":"string","format":"date-time","description":"When Clickr saw the invoice removed."}},"required":["invoiceId"]},"BuildertrendBills":{"title":"Bills","description":"Bills the builder owes its vendors and subs, with the amount, what has been paid, what is still owed and the purchase orders each bill is paid against.","type":"object","properties":{"billId":{"type":"string","description":"Buildertrend's id for the bill, unique across the account."},"billNumber":{"type":"string","description":"The bill number Buildertrend shows, for example 1184-0017: the job's number followed by a sequence within the job."},"title":{"type":"string","description":"The bill's title."},"builderId":{"type":"string","description":"Buildertrend's id for the builder account the bill belongs to."},"jobId":{"type":"string","description":"Buildertrend's id for the bill's job. Joins to the Buildertrend Jobs Dataset."},"jobName":{"type":"string","description":"The name of the bill's job, as Buildertrend shows it."},"payTo":{"type":"string","description":"The vendor or sub the bill is owed to."},"amount":{"type":"number","description":"The bill total in the account's own currency, signed. A negative amount is a credit or a return from the vendor, not an error."},"amountPaid":{"type":"number","description":"How much of the bill has been paid."},"remainingBalance":{"type":"number","description":"What is still owed on the bill. 0 means the bill is settled."},"paymentStatus":{"type":"number","description":"Buildertrend's payment status code, sent without a label. Its Bills page groups 2, 4 and 5 as paid and 1 and 10 as ready for payment, so read remainingBalance to tell whether a bill is settled."},"isSubRequested":{"type":"boolean","description":"True when the sub raised the bill through their portal rather than the builder entering it."},"documentType":{"type":"string","description":"Buildertrend's Type column for the bill. It has read Bill on every bill seen so far, credits included."},"source":{"type":"string","description":"Where the bill came from, in Buildertrend's words. It has read Manual on every bill seen so far."},"invoiceDate":{"type":"string","description":"The date on the vendor's invoice."},"dueDate":{"type":"string","description":"When the bill is due."},"datePaid":{"type":"string","description":"The date the bill is paid or scheduled to be paid. It is set on unpaid bills too, so read remainingBalance or amountPaid for proof of payment."},"createdDate":{"type":"string","description":"When the bill was created in Buildertrend."},"createdBy":{"type":"string","description":"The name of the person who created the bill, when Buildertrend sends it."},"createdById":{"type":"string","description":"Buildertrend's user id for the person who created the bill."},"paidBy":{"type":"string","description":"The name Buildertrend records as having paid the bill."},"paymentMethod":{"type":"string","description":"The payment method recorded on the bill, as text."},"description":{"type":"string","description":"The payment notes entered on the bill in Buildertrend."},"costCodes":{"type":"array","items":{"type":"string"},"description":"The cost codes on the bill, code and name together as Buildertrend displays them. Empty when there are none."},"varianceCodes":{"type":"array","items":{"type":"string"},"description":"The bill's variance codes. Empty on every bill seen so far."},"relatedPurchaseOrderIds":{"type":"array","items":{"type":"string"},"description":"The purchase orders this bill is paid against. Each matches purchaseOrderId in the Buildertrend Purchase Orders Dataset."},"relatedInvoiceIds":{"type":"array","items":{"type":"string"},"description":"The owner invoices this bill was passed on to. Each matches invoiceId in the Buildertrend Invoices Dataset."},"lienWaivers":{"type":"array","items":{"type":"object","properties":{"lienWaiverId":{"type":"string","description":"Buildertrend's id for the lien waiver."},"status":{"type":"number","description":"Buildertrend's code for the waiver's status: 0 Unreleased, 1 Pending, 2 Accepted, 4 Builder Accepted. Buildertrend's Bills page shows both 2 and 4 as Approved."},"statusText":{"type":"string","description":"Buildertrend's own word for the waiver's status, for example Pending or Builder Accepted."},"lienWaiverType":{"type":"number","description":"The waiver's type code: 1 Conditional, 2 Unconditional."},"lienWaiverTypeText":{"type":"string","description":"The waiver's type in words, Conditional or Unconditional, as Buildertrend's Bills page says it. Absent for any other code."},"purchaseOrderId":{"type":"string","description":"The purchase order the waiver was raised from, absent when it came from the bill alone. Joins to the Buildertrend Purchase Orders Dataset."},"title":{"type":"string","description":"The name of the waiver template, for example ALC Lien Waiver."},"statusLastUpdatedDate":{"type":"string","description":"When the waiver's status last changed. Buildertrend has not sent this on any waiver seen so far."}}},"description":"Every lien waiver on the bill, one entry each, sorted by lienWaiverId and empty when there are none. Read waivers here, not from lienWaiverStatus."},"lienWaiverSummary":{"type":"string","description":"Set by Clickr for filtering: None when the bill has no waiver, otherwise the statusText of its least-advanced waiver (Unreleased, then Pending, then Builder Accepted, then Accepted)."},"lienWaiverStatus":{"type":"number","description":"A second lien waiver cell Buildertrend includes on the row but has never been seen populated. Read lienWaivers and lienWaiverSummary instead."},"lienWaiverStatusText":{"type":"string","description":"The text that goes with lienWaiverStatus, which has never been seen populated. Read lienWaivers instead."},"lienWaiverStatusUpdatedDate":{"type":"string","description":"The date that goes with lienWaiverStatus, which has never been seen populated. Read lienWaivers instead."},"isOriginatedFromAccounting":{"type":"boolean","description":"True when the bill was created in the accounting system rather than in Buildertrend."},"attachedFileCount":{"type":"number","description":"How many files are attached to the bill."},"commentCount":{"type":"number","description":"How many comments the bill has."},"isDuplicated":{"type":"boolean","description":"Buildertrend's duplicate warning, raised when another bill looks the same. It can change when a different bill is added or deleted, so it never counts as a change to this bill."},"isDeleted":{"type":"boolean","description":"True once the bill has been removed in Buildertrend. Clickr keeps the record so you can see it went."},"deletedAt":{"type":"string","format":"date-time","description":"When Clickr saw the bill removed."}},"required":["billId"]},"BuildertrendLeadProposals":{"title":"Lead proposals","description":"Proposals sent to leads, with the client price, the deposit required, who owns the opportunity and when the status last moved.","type":"object","properties":{"leadProposalId":{"type":"string","description":"Buildertrend's id for the lead proposal."},"leadId":{"type":"string","description":"Buildertrend's id for the lead the proposal belongs to. Joins to the Buildertrend Leads Dataset."},"builderId":{"type":"string","description":"Buildertrend's id for the builder account."},"title":{"type":"string","description":"The proposal's title."},"opportunityTitle":{"type":"string","description":"The title of the lead the proposal belongs to, copied from the lead."},"clientContactName":{"type":"string","description":"The name of the client contact being quoted."},"clientContactId":{"type":"string","description":"Buildertrend's id for the client contact being quoted. Joins to contactId in the Buildertrend Client Contacts Dataset."},"clientPrice":{"type":"number","description":"The price the proposal quotes to the client."},"requiredPayment":{"type":"number","description":"The deposit the proposal asks for, not what the client has paid."},"proposalStatus":{"type":"number","description":"Buildertrend's own proposal status code. Buildertrend sends no label with it, and Clickr does not map it to one."},"statusUpdatedDate":{"type":"string","description":"When the proposal's status last changed, as a date and time with no time zone."},"statusUpdatedBy":{"type":"string","description":"The name of who last changed the proposal's status."},"paymentStatus":{"type":"number","description":"Buildertrend's own code for the deposit on this proposal, sent with no label. It says nothing about the amount: requiredPayment is what the proposal asks for."},"isJobProposal":{"type":"boolean","description":"Buildertrend's flag for a proposal that belongs to a job rather than a lead. It has been false on every proposal this dataset has held."},"opportunityStatus":{"type":"number","description":"The lead's status as Buildertrend's own code, not the proposal's. Join leadId to the Buildertrend Leads Dataset for the rest of the lead."},"salespeople":{"type":"array","items":{"type":"string"},"description":"The names of the salespeople on the proposal. Empty when nobody owns it."},"projectType":{"type":"string","description":"The project type Buildertrend shows for the proposal."},"takeoffStatus":{"type":"boolean","description":"Whether a takeoff has been done for this proposal."},"lastViewedDate":{"type":"string","description":"When the client last opened the proposal. Absent means they have not opened it, not that it was never sent."},"updatedDate":{"type":"string","description":"When the proposal was last updated."},"createdDate":{"type":"string","description":"When the proposal was created."},"createdBy":{"type":"string","description":"The name of who created the proposal."},"isDeleted":{"type":"boolean","description":"True once the proposal is no longer among Buildertrend's lead proposals. A lead converted to a job looks the same, so it can mean converted, not deleted."},"deletedAt":{"type":"string","format":"date-time","description":"When Clickr saw the proposal leave Buildertrend's lead proposals."}},"required":["leadProposalId"]},"BuildertrendSelections":{"title":"Selections","description":"Selections on a job, with the deadline the client owes a decision by, the approved price, the allowance it draws down and who signed it off.","type":"object","properties":{"selectionId":{"type":"string","description":"Buildertrend's id for the selection, unique across the account."},"jobId":{"type":"string","description":"Buildertrend's id for the selection's job. Joins to the Buildertrend Jobs Dataset."},"builderId":{"type":"string","description":"Buildertrend's id for the builder, the company account the selection belongs to."},"title":{"type":"string","description":"The selection's title."},"category":{"type":"string","description":"The builder's own grouping for the selection, such as Plumbing Fixtures. Free text and often empty."},"location":{"type":"string","description":"Where in the house the selection applies, such as Bedroom 1. Free text and often empty."},"choiceCount":{"type":"number","description":"How many options the client can choose between, 0 when there is nothing to pick yet. The options themselves are not in this dataset."},"maxSelected":{"type":"number","description":"How many choices may be picked, usually 1. Buildertrend sends -999 where the selection is not limited to one."},"price":{"type":"number","description":"The approved price for the selection, in the account's currency. 0 until a priced choice is approved, and not the price of each choice."},"allowanceId":{"type":"string","description":"Buildertrend's id for the allowance the selection draws down, on jobs that budget allowances."},"allowanceTitle":{"type":"string","description":"The title of the allowance the selection draws down."},"allowanceTotal":{"type":"number","description":"The allowance's budget, in the account's currency."},"remainingAllowance":{"type":"number","description":"What is left of the allowance, in the account's currency. It describes the whole allowance, not this selection alone."},"deadline":{"type":"string","description":"When the client owes the decision, as a date and time with no time zone. Absent means no deadline was set, not that it is due today."},"status":{"type":"number","description":"Buildertrend's status code for the selection, sent with no label, so it is not a status name (-1, 2 and 3 have been seen). To tell whether it is decided, read approvedBy and selectedDate."},"approvedBy":{"type":"string","description":"Who signed the selection off, a client or a staff member. Absent until someone does."},"selectedDate":{"type":"string","description":"When the selection was signed off, as a date and time with no time zone."},"subPriceOutstandingCount":{"type":"number","description":"How many of the selection's choices are still waiting on a price from a sub."},"tbdPriceCount":{"type":"number","description":"How many of the selection's choices are priced TBD."},"isLocked":{"type":"boolean","description":"True when the selection is locked and the client can no longer edit it."},"attachedFileCount":{"type":"number","description":"How many files are attached to the selection."},"commentCount":{"type":"number","description":"How many comments the selection's discussion has."},"isDeleted":{"type":"boolean","description":"True once the selection has been removed in Buildertrend, confirmed by a second read of its job. Clickr keeps the record so you can see it went."},"deletedAt":{"type":"string","format":"date-time","description":"When Clickr saw the selection removed."}},"required":["selectionId"]},"BuildertrendBidPackages":{"title":"Bid packages","description":"Scopes of work put out to tender, each with the subs invited, what they quoted and which bid was accepted.","type":"object","properties":{"bidPackageId":{"type":"string","description":"Buildertrend's id for the bid package."},"bidPackageExternalId":{"type":"string","description":"The GUID Buildertrend also uses for the package on its newer screens."},"jobId":{"type":"string","description":"Buildertrend's id for the job the package belongs to. Joins to the Buildertrend Jobs Dataset."},"jobName":{"type":"string","description":"The name of the job the package belongs to."},"builderId":{"type":"string","description":"Buildertrend's id for the builder account."},"title":{"type":"string","description":"The bid package's title."},"completionStatus":{"type":"number","description":"Buildertrend's own bid package status code, sent with no label. Read releasedDate for whether it went out and approvedCount for whether a bid was accepted."},"releasedDate":{"type":"string","description":"When the package was released to subs. Absent while it is still being prepared."},"deadlineDate":{"type":"string","description":"When bids are due, as a date and time with no time zone. Absent when no deadline is set."},"bidRequestCount":{"type":"number","description":"How many subs were asked to bid on the package."},"responseCount":{"type":"number","description":"How many of the invited subs have answered."},"approvedCount":{"type":"number","description":"How many bids on the package have been accepted."},"totalApprovedBidAmount":{"type":"number","description":"The total of the accepted bids, not of every bid received."},"isUsingDivisions":{"type":"boolean","description":"Whether the package is split into divisions, which divide it by trade."},"bidDivisionCount":{"type":"number","description":"How many divisions the package is split into."},"unlinkedBidLineItemCount":{"type":"number","description":"Buildertrend's count of unlinked bid line items on the package."},"relatedScheduleCount":{"type":"number","description":"How many schedule items Buildertrend links to the package."},"rfiCount":{"type":"number","description":"How many requests for information (RFIs) are on the package."},"attachedFileCount":{"type":"number","description":"How many files are attached to the package."},"bids":{"type":"array","items":{"type":"object","properties":{"bidId":{"type":"string","description":"Buildertrend's id for the bid, unique across the account."},"subName":{"type":"string","description":"The sub or vendor the bid is from."},"amount":{"type":"number","description":"What the sub quoted. 0 until they answer."},"submittedStatus":{"type":"number","description":"Buildertrend's own code for the bid's submission, sent with no label. submittedDate shows whether it has been submitted."},"submittedDate":{"type":"string","description":"When the bid was submitted. Absent until it has been."},"submittedByUser":{"type":"string","description":"The name of who submitted the bid."},"confirmedStatus":{"type":"number","description":"Buildertrend's own confirmation code for the bid, sent with no label. confirmedDate shows whether it has been confirmed."},"confirmedDate":{"type":"string","description":"When the bid was confirmed. Absent until it has been."},"subViewedDate":{"type":"string","description":"When the sub opened the bid request. Absent means they have not opened it, not that it was never sent."},"isSubmittedByBuilder":{"type":"boolean","description":"True when the builder entered the bid on the sub's behalf rather than the sub submitting it."},"isBudgeted":{"type":"boolean","description":"Whether Buildertrend marks the bid as budgeted."},"relatedPurchaseOrderIds":{"type":"array","items":{"type":"string"},"description":"Ids of the purchase orders linked to this bid once it is accepted. Joins to the Buildertrend Purchase Orders Dataset."},"relatedChangeOrderIds":{"type":"array","items":{"type":"string"},"description":"Ids of the change orders linked to this bid once it is accepted. Joins to the Buildertrend Change Orders Dataset."},"attachedFileCount":{"type":"number","description":"How many files are attached to the bid."},"commentCount":{"type":"number","description":"How many comments the bid has."}},"required":["bidId"]},"description":"The subs' bids on this package, sorted by bidId. A bid arriving, changing or being withdrawn is a change to the package, never a created or deleted record."},"isDeleted":{"type":"boolean","description":"True once the package has been removed in Buildertrend. Clickr keeps the record so you can see it went."},"deletedAt":{"type":"string","format":"date-time","description":"When Clickr saw the package removed."}},"required":["bidPackageId"]},"BuildertrendJobCostingBudget":{"title":"Job costing budget","description":"Every cost code on a job budget, with what was budgeted, what is committed, what has been spent and what the job is projected to make on it.","type":"object","properties":{"budgetLineId":{"type":"string","description":"Buildertrend's id for this cost code on this job's budget. Each record is one cost code on one job, and the same cost code has a different id on each job."},"jobId":{"type":"string","description":"Buildertrend's id for the job the budget belongs to. Joins to the Buildertrend Jobs Dataset."},"jobName":{"type":"string","description":"The job's name. Kept current, but a rename is not reported as a change to this line."},"title":{"type":"string","description":"The cost code's title as it appears on the job's budget."},"costCategoryId":{"type":"string","description":"Buildertrend's id for the cost category this cost code sits under."},"costCategoryTitle":{"type":"string","description":"The name of the cost category this cost code sits under. Kept current, but a rename is not reported as a change to this line."},"parentBudgetLineId":{"type":"string","description":"The budgetLineId of the cost code this one is nested under. Absent on a top-level cost code."},"costCodePath":{"type":"array","items":{"type":"string"},"description":"The titles of the cost codes above this one, from the top level down. Empty on a top-level cost code."},"isMarkedComplete":{"type":"boolean","description":"Whether the cost code has been marked complete in Buildertrend."},"projectedCostType":{"type":"number","description":"Buildertrend's own code for how the projected cost is worked out. It is not a status, and Buildertrend sends no label with it."},"isProjectedCostAutoCalculated":{"type":"boolean","description":"True when Buildertrend calculates the projected cost rather than someone typing it in."},"hasAdjustments":{"type":"boolean","description":"Whether Buildertrend shows adjustments on this cost code."},"originalBudgetCosts":{"type":"number","description":"The budget for this cost code before any revisions."},"revisedBudgetCosts":{"type":"number","description":"The current budget for this cost code, after any revisions."},"baselineCosts":{"type":"number","description":"Buildertrend's baseline cost for this cost code."},"pendingCosts":{"type":"number","description":"Buildertrend's pending costs for this cost code."},"committedCosts":{"type":"number","description":"Money promised but not yet spent on this cost code, from released purchase orders. Not included in actualCosts."},"actualCosts":{"type":"number","description":"What has been spent against this cost code so far."},"projectedCosts":{"type":"number","description":"The total cost Buildertrend projects for this cost code."},"projectedCostsWithoutAdjustments":{"type":"number","description":"The projected cost for this cost code with adjustments left out."},"costToComplete":{"type":"number","description":"What Buildertrend expects is still to be spent on this cost code."},"revisedVsProjected":{"type":"number","description":"The revised budget minus the projected cost. Negative when the cost code is projected to go over budget."},"builderVariance":{"type":"number","description":"Buildertrend's builder variance for this cost code."},"standaloneBillBuilderVariance":{"type":"number","description":"Buildertrend's builder variance from standalone bills on this cost code."},"standaloneActualCosts":{"type":"number","description":"Buildertrend's standalone actual costs for this cost code."},"originalOwnerPrice":{"type":"number","description":"The price to the client for this cost code before any revisions."},"revisedOwnerPrice":{"type":"number","description":"The price to the client for this cost code after any revisions."},"totalOriginalPrice":{"type":"number","description":"Buildertrend's total original price for this cost code."},"totalRevisedPrice":{"type":"number","description":"Buildertrend's total revised price for this cost code. projectedProfit is this minus projectedCosts."},"taxes":{"type":"number","description":"The taxes Buildertrend shows on this cost code."},"percentInvoiced":{"type":"number","description":"The share of this cost code's price invoiced so far."},"amountInvoiced":{"type":"number","description":"How much has been invoiced against this cost code so far."},"remainingToInvoice":{"type":"number","description":"How much of this cost code's price is still to be invoiced."},"retainageHeld":{"type":"number","description":"The retainage held on this cost code."},"projectedProfit":{"type":"number","description":"What the job is projected to make on this cost code: totalRevisedPrice minus projectedCosts."},"projectedProfitMargin":{"type":"number","description":"The projected profit as a percentage of the revised price, so 4.52 means 4.52%."},"estimatedGrossProfit":{"type":"number","description":"Buildertrend's estimated gross profit for this cost code."},"profitPercentOverEstimated":{"type":"number","description":"Buildertrend's profit percentage over the estimate for this cost code."},"originalBudgetQuantity":{"type":"number","description":"The quantity budgeted for this cost code before any revisions. The record does not carry its unit."},"revisedBudgetQuantity":{"type":"number","description":"The quantity budgeted for this cost code after any revisions. The record does not carry its unit."},"actualLaborHours":{"type":"number","description":"Hours of labour Buildertrend records against this cost code."},"jobRevisedBudgetCosts":{"type":"number","description":"The whole job's revised budget. Copied onto every line of the job, and not reported as a change to this line."},"jobCommittedCosts":{"type":"number","description":"The whole job's committed costs. Copied onto every line of the job, and not reported as a change to this line."},"jobActualCosts":{"type":"number","description":"The whole job's actual costs. Copied onto every line of the job, and not reported as a change to this line."},"jobProjectedCosts":{"type":"number","description":"The whole job's projected costs. Copied onto every line of the job, and not reported as a change to this line."},"jobProjectedProfit":{"type":"number","description":"The whole job's projected profit. Copied onto every line of the job, and not reported as a change to this line."},"jobProjectedProfitMargin":{"type":"number","description":"The whole job's projected profit as a percentage of its revised price, so 12.5 means 12.5%. Copied onto every line, and not reported as a change to it."},"jobTotalRevisedPrice":{"type":"number","description":"The whole job's total revised price. Copied onto every line of the job, and not reported as a change to this line."},"jobAmountInvoiced":{"type":"number","description":"How much has been invoiced on the whole job. Copied onto every line of the job, and not reported as a change to this line."},"isDeleted":{"type":"boolean","description":"True once the cost code has been removed from the job's budget in Buildertrend. Clickr keeps the record, and rechecks open jobs only."},"deletedAt":{"type":"string","format":"date-time","description":"When Clickr saw the cost code removed from the job's budget."}},"required":["budgetLineId","jobId"]},"BuildertrendDocuments":{"title":"Documents","description":"Every file your team keeps in a job's Documents folders, with the folder it is in and a link to download it. Read once a day.","type":"object","properties":{"documentKey":{"type":"string","description":"The record's key, the job and the file as {jobId}:file:{fileId}. Moving the file to another folder keeps the same key."},"jobId":{"type":"string","description":"Buildertrend's id for the job whose Documents hold the file. Joins to the Buildertrend Jobs Dataset."},"jobName":{"type":"string","description":"The job's name in Buildertrend. A rename alone is not reported as a change to the file."},"builderId":{"type":"string","description":"Buildertrend's id for the builder account."},"fileId":{"type":"string","description":"Buildertrend's id for the file. The downloadUrl on this record is a link to the same file."},"documentId":{"type":"string","description":"Buildertrend's other id for the file. It does not address the file, so use fileId."},"title":{"type":"string","description":"The file's name as uploaded, extension included."},"extension":{"type":"string","description":"The file's extension, such as pdf."},"sizeInBytes":{"type":"number","description":"The file's size in bytes."},"addedBy":{"type":"string","description":"The name of the person who added the file."},"dateAttached":{"type":"string","description":"When the file was added in Buildertrend."},"dateModified":{"type":"string","description":"When the file was last modified in Buildertrend."},"isTemplate":{"type":"boolean","description":"Whether Buildertrend marks the file as a template."},"folderId":{"type":"string","description":"Buildertrend's id for the folder the file is in. A file moved to another folder keeps its record and changes this."},"folderPath":{"type":"string","description":"Where the file sits, read like Buildertrend's own breadcrumb (Documents / Plans). Renaming a folder updates it without reporting its files as changed."},"showSubs":{"type":"boolean","description":"Buildertrend's setting for whether subcontractors may see the file. Accounts that never use it have it false everywhere, so false does not always mean hidden."},"showOwner":{"type":"boolean","description":"Buildertrend's setting for whether the client may see the file."},"rowVersion":{"type":"string","description":"Buildertrend's version marker for the file's link. A change to it alone is not reported as a change to the file."},"ownerViewedDate":{"type":"string","description":"When the client viewed the file in Buildertrend. A change to it alone is not reported as a change to the file."},"isDeleted":{"type":"boolean","description":"True once the file has been removed from the job's Documents in Buildertrend. Clickr keeps the record so you can see it went."},"deletedAt":{"type":"string","format":"date-time","description":"When Clickr saw the file removed. Documents are read about once a day, on open jobs only."},"downloadUrl":{"type":"string","description":"A signed link to the file that needs no API key. It is minted on every read and expires after 1 hour, so read the record again rather than storing it."}},"required":["documentKey","jobId","fileId"]},"BuildertrendTimeClocks":{"title":"Time clocks","description":"Time card rows from the Time Clock module: one shift per record, with its job, worker, clock in and out, break, overtime split and approval state.","type":"object","properties":{"timeClockId":{"type":"string","description":"Buildertrend's id for the time card. Each time card is one shift, so a worker who clocks into two jobs on one date has two records."},"builderId":{"type":"string","description":"Buildertrend's id for the builder account."},"jobId":{"type":"string","description":"Buildertrend's id for the job the shift was worked on. Joins to the Buildertrend Jobs Dataset."},"jobName":{"type":"string","description":"The name of the job the shift was worked on."},"userId":{"type":"string","description":"Buildertrend's user id for the worker on the shift."},"userName":{"type":"string","description":"The worker's full name, as Buildertrend shows it."},"firstName":{"type":"string","description":"The worker's first name."},"lastName":{"type":"string","description":"The worker's last name."},"shiftDate":{"type":"string","description":"The shift's date in the jobsite's local time, with no time zone. Clickr resyncs shifts dated in the last 14 days, so edits to older shifts are not picked up."},"clockIn":{"type":"object","properties":{"timeStamp":{"type":"string","description":"When the worker clocked in, as a local date and time with no time zone."},"latitude":{"type":"number","description":"Latitude where the worker clocked in. Absent when no location was recorded."},"longitude":{"type":"number","description":"Longitude where the worker clocked in. Absent when no location was recorded."},"outOfBounds":{"type":"boolean","description":"True when Buildertrend's geofence placed the clock-in outside the jobsite."}},"description":"Where and when the worker clocked in."},"clockOut":{"type":"object","properties":{"timeStamp":{"type":"string","description":"When the worker clocked out, as a local date and time with no time zone. Absent while the shift is still open."},"latitude":{"type":"number","description":"Latitude where the worker clocked out. Absent when no location was recorded."},"longitude":{"type":"number","description":"Longitude where the worker clocked out. Absent when no location was recorded."},"outOfBounds":{"type":"boolean","description":"True when Buildertrend's geofence placed the clock-out outside the jobsite."}},"description":"Where and when the worker clocked out."},"breakMinutes":{"type":"number","description":"Minutes of break taken during the shift."},"isOnBreak":{"type":"boolean","description":"True while the worker is on a break."},"regularMinutes":{"type":"number","description":"Minutes of the shift counted as regular time."},"overtimeMinutes":{"type":"number","description":"Minutes of the shift counted as overtime."},"doubleOvertimeMinutes":{"type":"number","description":"Minutes of the shift counted as double overtime."},"personalTimeOffMinutes":{"type":"number","description":"Minutes of personal time off on the time card."},"totalWorkMinutes":{"type":"number","description":"Minutes worked on the shift, not hours: 724 is 12 hours 4 minutes. Zero while the shift is still open, and it does not count up as the shift runs."},"isApproved":{"type":"boolean","description":"Whether the time card has been approved."},"approvedByName":{"type":"string","description":"The name of who last changed the time card's approval, which on an approved card is the approver."},"approvedById":{"type":"string","description":"Buildertrend's user id for who last changed the time card's approval."},"approvedDate":{"type":"string","description":"When the time card's approval last changed."},"costRate":{"type":"string","description":"The worker's cost rate as Buildertrend displays it, for example \"$19.00\". It reflects the worker's current rate, not the rate on the day of the shift."},"builderCost":{"type":"number","description":"The shift's cost, worked out from its minutes and the worker's current cost rate, so it changes when that rate does."},"billableRate":{"type":"string","description":"The billable rate as Buildertrend displays it. Absent when no billable rate is set."},"billableAmount":{"type":"number","description":"The billable amount for the shift. Absent, rather than 0, when Buildertrend has no figure, such as when no billable rate is set."},"costCodes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Buildertrend's id for the cost code."},"title":{"type":"string","description":"The cost code's name."},"minutes":{"type":"number","description":"Minutes of the shift charged to this cost code. Can be fractional, such as 724.002."}}},"description":"How the shift's minutes were split across cost codes."},"createdById":{"type":"string","description":"Buildertrend's user id for who created the time card."},"createdByName":{"type":"string","description":"The name of who created the time card."},"createdDate":{"type":"string","description":"When the time card was created."},"notes":{"type":"string","description":"Notes entered on the time card."},"tags":{"type":"array","description":"Tags on the time card. The format of each entry has not been confirmed yet."},"relatedOwnerInvoices":{"type":"array","description":"Owner invoices Buildertrend links to the time card. The format of each entry has not been confirmed yet."},"edited":{"type":"object","properties":{"clockInMode":{"type":"number","description":"Buildertrend's own code for how the clock-in was made. Buildertrend sends no label with it."},"clockedInByName":{"type":"string","description":"The name of who recorded the clock-in."},"clockedInByDate":{"type":"string","description":"When the clock-in was recorded, as a local date and time with no time zone."},"clockOutMode":{"type":"number","description":"Buildertrend's own code for how the clock-out was made. Buildertrend sends no label with it."},"clockedOutByName":{"type":"string","description":"The name of who recorded the clock-out."},"clockedOutByDate":{"type":"string","description":"When the clock-out was recorded, as a local date and time with no time zone."},"minuteDistributionType":{"type":"number","description":"Buildertrend's own code for how the shift's minutes are distributed. Buildertrend sends no label with it."},"minutesUpdatedByName":{"type":"string","description":"The name of who adjusted the shift's minutes after it was punched. Absent if nobody has."},"minutesUpdatedByDate":{"type":"string","description":"When the shift's minutes were last adjusted."},"breakModifiedByName":{"type":"string","description":"The name of who adjusted the shift's break after it was punched. Absent if nobody has."},"breakModifiedByDate":{"type":"string","description":"When the shift's break was last adjusted."}},"description":"The time card's audit trail: who punched in and out and when, and who adjusted the minutes or the break afterwards."},"gustoSyncStatus":{"type":"number","description":"Buildertrend's own code for the time card's sync to Gusto. Buildertrend sends no label with it, and Clickr does not map it to one."},"isDeleted":{"type":"boolean","description":"True once the time card has been removed in Buildertrend. Clickr keeps the record, and notices removals only for shifts dated in the last 14 days."},"deletedAt":{"type":"string","format":"date-time","description":"When Clickr saw the time card removed."}},"required":["timeClockId"]},"BuildertrendInternalUsers":{"title":"Internal users","description":"Your Buildertrend staff with their role, email, phone and login status.","type":"object","properties":{"userId":{"type":"string","description":"Buildertrend's id for the user."},"loginId":{"type":"string","description":"Buildertrend's login id for the user. It has matched userId on every user seen so far, but Buildertrend sends it separately."},"builderId":{"type":"string","description":"Buildertrend's id for the builder account the user belongs to."},"name":{"type":"string","description":"The user's name exactly as Buildertrend shows it, spacing included. Use it to match assignedUser in the Buildertrend Lead Activities Dataset."},"nameNormalized":{"type":"string","description":"The name lowercased, trimmed and with runs of spaces collapsed to one, for a match that survives a stray double space."},"role":{"type":"string","description":"The user's role, as the builder named it in Buildertrend, for example Job Superintendent."},"roleId":{"type":"string","description":"Buildertrend's id for the role."},"email":{"type":"string","description":"The email field as Buildertrend stores it, which can hold several addresses joined by semicolons."},"emails":{"type":"array","items":{"type":"string"},"description":"Every address in email, split, trimmed, lowercased and deduplicated, in the order Buildertrend lists them."},"primaryEmail":{"type":"string","description":"The first address in emails, which is the one Buildertrend shows. The address to send to."},"phoneNumber":{"type":"string","description":"The user's phone number as entered in Buildertrend, with no formatting applied."},"cellEmail":{"type":"string","description":"Buildertrend's cell email field for the user, as entered."},"contactInfo":{"type":"string","description":"Buildertrend's contact info field for the user, as entered."},"hasCompanySettingsAccess":{"type":"boolean","description":"Whether the user has access to Company Settings in Buildertrend."},"autoAccess":{"type":"boolean","description":"Whether Buildertrend's Auto Access setting is on for the user."},"activationStatus":{"type":"number","description":"Buildertrend's login status code: 3 for active and 0 for inactive in the data seen so far. Read activationStatusText for the label."},"activationStatusText":{"type":"string","description":"Buildertrend's own label for the login status, for example ACTIVE or INACTIVE."},"customFields":{"description":"The account's custom columns for the user, as Buildertrend sends them. Absent when there are none."},"isDeleted":{"type":"boolean","description":"True once the user has been removed from Buildertrend. A deactivated user is not deleted: they stay, with activationStatus 0."},"deletedAt":{"type":"string","format":"date-time","description":"When Clickr saw the user removed."}},"required":["userId","name"]},"BuildertrendClientContacts":{"title":"Client contacts","description":"Your Buildertrend contacts with their email, phone, address and how many jobs and leads each one is on.","type":"object","properties":{"contactId":{"type":"string","description":"Buildertrend's id for the contact."},"builderId":{"type":"string","description":"Buildertrend's id for the builder account the contact belongs to."},"displayName":{"type":"string","description":"The contact's name exactly as Buildertrend shows it, including any leading, trailing or doubled spaces. Often the only name a contact has."},"displayNameNormalized":{"type":"string","description":"The display name trimmed, lowercased and with runs of spaces collapsed to one, for matching names. Clickr derives it from displayName."},"firstName":{"type":"string","description":"The contact's first name, present only when it was entered separately from the display name."},"lastName":{"type":"string","description":"The contact's last name, present only when it was entered separately from the display name."},"email":{"type":"string","description":"The contact's email field as Buildertrend stores it, which can hold several addresses separated by semicolons."},"emails":{"type":"array","items":{"type":"string"},"description":"Every address in the email field, trimmed, lowercased and with duplicates removed, in the order Buildertrend lists them."},"primaryEmail":{"type":"string","description":"The first address in emails, which is the one Buildertrend shows. Use it when you need a single address to send to."},"phone":{"type":"string","description":"The contact's phone number, as entered. Formats vary from contact to contact, since Buildertrend does not normalise them."},"cell":{"type":"string","description":"The contact's mobile number, as entered, in whatever format it was typed."},"street":{"type":"string","description":"The street line of the contact's mailing address."},"suburb":{"type":"string","description":"Buildertrend's locality line for non-US addresses. Absent on US addresses."},"city":{"type":"string","description":"The city of the contact's mailing address."},"state":{"type":"string","description":"The state of the contact's mailing address."},"zip":{"type":"string","description":"The ZIP or postal code of the contact's mailing address."},"activationStatus":{"type":"number","description":"Buildertrend's code for the contact's owner portal login state. 0 is the not invited or inactive end of the scale; other values are not mapped to labels."},"activationConfirmed":{"type":"string","format":"date-time","description":"When the contact accepted their owner portal invite."},"jobCount":{"type":"number","description":"The number of jobs Buildertrend shows against the contact on its Contacts page. Can be lower than jobTotalCount."},"jobTotalCount":{"type":"number","description":"How many jobs the contact is linked to, open or not."},"leadCount":{"type":"number","description":"The number of leads Buildertrend shows against the contact on its Contacts page. Can be lower than leadTotalCount."},"leadTotalCount":{"type":"number","description":"How many leads the contact is linked to, open or not."},"customFields":{"description":"Your account's custom contact fields, passed through as Buildertrend sends them. Absent when the contact has none."},"isDeleted":{"type":"boolean","description":"True once the contact has been removed from Buildertrend. Clickr keeps the record so you can see it went, and a deactivated contact is not counted as removed."},"deletedAt":{"type":"string","format":"date-time","description":"When Clickr saw the contact removed."}},"required":["contactId","displayName"]},"QuickbooksProjects":{"title":"Projects","description":"Name, status, start and end dates for every project in QuickBooks.","type":"object","properties":{"projectId":{"type":"string","description":"QuickBooks' id for the project. The QuickBooks Projects API returns the same id when it creates a project."},"name":{"type":"string","description":"The project's name in QuickBooks."},"status":{"type":"string","enum":["Open","Inprogress","Complete","Canceled"],"description":"The project's status in QuickBooks' own spelling: Open (not started), Inprogress, Complete or Canceled."},"startDate":{"type":"string","description":"The project's start date in QuickBooks."},"endDate":{"type":"string","description":"The project's due date in QuickBooks."},"notes":{"type":"string","description":"The project's description in QuickBooks."},"isDeleted":{"type":"boolean","description":"True once the project has been deleted in QuickBooks. Clickr keeps the record so you can see it went."}},"required":["projectId","name","status"]}}}}