Skip to content
TruTecDevelopers
Get an API key

Re-bids, reminders & My day

Create re-bid jobs, snooze or decline re-bids, add past work, work the contract-renewal and maintenance reminders, update many follow-ups at once, and set "remind me" and birthday follow-ups.

View as Markdown

These endpoints do what the buttons on the Re-bids page, My day and the Touch points window do. Each one runs the app's own action as the person who created the API key, so the same rules apply (a member who only sees their own jobs can only act on their own re-bids, for example) and the change shows in the timeline under their name.

Nothing here emails or texts a customer. Reminders and "remind me" follow-ups email your teammate when they come due, the same as in the app.

Note

Partner keys that act for several workspaces must also send firm_id (query string, or JSON body on writes).

Errors are {"error": "...", "message": "..."}. Another workspace's id is a 404. A body field the endpoint doesn't take is a 400 naming it.

Re-bid actions#

A re-bid is one property x one service coming due again (read them with GET /v1/rebids). It is identified by the pair key + cycle_id from that list. key can hold an address, so it always travels in the JSON body, never in the URL.

Create re-bid jobs#

POST /v1/rebids/create-jobs

Permission: Write jobs

Creates the re-bid job for each item, exactly like Create re-bid on the page (the job lands in your pipeline with the property, customer and service filled in). An item that already has its job returns it. Up to 100 items per call; one bad item never blocks the rest.

curl -X POST "https://trutec.ai/api/v1/rebids/create-jobs" \
  -H "X-API-Key: sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{"items": [{"key": "loc:812", "cycle_id": 3}, {"key": "loc:977", "cycle_id": 3}]}'
{
  "data": {
    "created": 2, "existing": 0, "failed": 0,
    "items": [
      {"key": "loc:812", "cycle_id": 3, "rebid_job_id": 70412, "rebid_job_name": "Sealcoating re-bid - Oak Hills Plaza"},
      {"key": "loc:977", "cycle_id": 3, "rebid_job_id": 70413, "rebid_job_name": "Sealcoating re-bid - Ridgeview HOA"}
    ]
  }
}

201 when at least one job was created, else 200. Errors: 404 with items listing the pairs that aren't re-bids in this workspace; 403 when jobs in this workspace come from a connected system and can't be created in TruTec.

Snooze, decline or reset a re-bid#

Endpoint Body What it does
POST /v1/rebids/snooze key, cycle_id, until (YYYY-MM-DD) Hide it until a date after today (at most two years out).
POST /v1/rebids/not-doing key, cycle_id, reason, note Take it off the list. reason is sold, self (they do it themselves), competitor or other (needs a note).
POST /v1/rebids/reset key, cycle_id Undo a snooze or "not doing".

Permission: Write jobs. Each returns {"data": {re-bid}} with the new status, snooze_until and not_doing_reason.

Schedule a re-bid follow-up#

POST /v1/rebids/follow-up

Permission: Write jobs

A company follow-up about the re-bid (the property needs a company). It shows in the assignee's My day and they are reminded when it's due.

Name Type Required Description
key, cycle_id Yes The re-bid.
due string Yes YYYY-MM-DD.
title string No Default Call about <service> re-bid - <property>.
assigned_to_user_id integer No Default: the property's salesperson, else the key's user.
task_type string No call (default), email, meeting, site_visit or follow_up.

Returns 201 with {"data": {"rebid": {...}, "task": {company follow-up}}}.

Add past work#

POST /v1/rebids/history

Permission: Write jobs

Record work done at a site that isn't in TruTec as a job ("we sealcoated it in June 2023"), so its re-bid comes due on time.

Name Type Required Description
location_id integer Yes The site.
cycle_id integer One of The service, from GET /v1/rebid-cycles.
new_service string One of Or a service name to add (an existing one with that name is reused).
new_service_every_years integer No How often the new service comes due. Default 2.
done_on string Yes YYYY-MM-DD.
amount number No What it cost, in dollars.
note string No

Returns 201 with {"data": {"id", "location_id", "cycle_id", "done_on", "amount", "note", "source": "manual", ...}}.

Remove past work#

DELETE /v1/rebids/history/{record_id}

Permission: Write jobs + Delete records

Only work added by hand can be removed (409 otherwise: work from a job follows the job). Returns 204.

Reminders#

Contract-renewal and maintenance check-in reminders on customers (set from the customer's renewal date and check-in interval), plus other office reminders. When one comes due, the assignee gets an email and it shows in their My day.

The reminder object#

Field Type Description
id integer TruTec id.
title, description string
reminder_type string contract_renewal, maintenance_checkin or follow_up.
status string pending, sent (emailed, not handled yet), done or dismissed.
client_account_id, contact_id, job_id, lead_id integer or null What it is about.
repeat_every_days integer or null null = one-off.
due_at string or null When it emails the assignee next (UTC).
last_emailed_at string or null
assigned_to_user_id, assigned_to Who gets it.
created_at string UTC.

List reminders#

GET /v1/reminders

Permission: Read jobs

Soonest due first. Filters: status (open = pending or sent, the default; pending, sent, done, dismissed, all), reminder_type, client_account_id, contact_id, job_id, assigned_to_user_id, due_before, due_after (ISO 8601), limit, offset.

Update a reminder#

PATCH /v1/reminders/{reminder_id}

Permission: Write jobs

Only the fields sent change.

Name Type Description
title, description string
due string Local YYYY-MM-DDTHH:MM, or a date (9:00 AM), read in timezone. Reschedules it.
snooze string Instead of due: 1h, tomorrow (8 AM) or next_week (Monday 8 AM).
timezone string IANA zone for due / snooze. Default the workspace's.
repeat_every + repeat_unit integer + string Repeat every N days, weeks or months. 0 stops repeating.
assigned_to_user_id integer or null

Complete or dismiss a reminder#

POST /v1/reminders/{reminder_id}/complete with optional notes (logged on the customer or job). A repeating reminder stays open for its next round. 409 when it is already done or dismissed.

POST /v1/reminders/{reminder_id}/dismiss stops it: it won't email again.

Permission: Write jobs. Both return {"data": {reminder}}.

Update many follow-ups at once#

POST /v1/follow-ups/bulk

Permission: Write jobs

My day's select many: mark done, snooze or reassign job follow-ups, company follow-ups and reminders in one call.

Name Type Required Description
action string Yes done, snooze or reassign.
task_ids integer[] One of Job follow-ups (/v1/tasks).
account_task_ids integer[] One of Company follow-ups (/v1/account-tasks).
reminder_ids integer[] One of Reminders.
snooze string For snooze 1h, tomorrow or next_week.
assigned_to_user_id integer For reassign An office user.
{"data": {"action": "snooze", "changed": 7, "skipped": 1}}

Rows the key's user may not act on, or already finished, are skipped and counted. Every id must be in this workspace (404 lists the ones that aren't).

"Remind me" and birthday follow-ups#

Remind me about a customer or a person#

POST /v1/client-accounts/{account_id}/remind-me POST /v1/contacts/{contact_id}/remind-me

Permission: Write jobs

The Touch points window's Remind me: a company follow-up for the key's user (from a person, it goes on their company and names them; the person must be linked to a company).

Name Type Required Description
due_date string Yes YYYY-MM-DD.
due_time string No 24-hour HH:MM. Default 09:00.
title string No Default Call <name>.
repeat string No none (default), weekly, monthly or yearly.
email_me string No none (default), that_day or day_before: emails the key's user.
task_type string No call (default), email or follow_up.
note string No

Returns 201 with {"data": {company follow-up}}.

Birthday reminder#

POST /v1/contacts/{contact_id}/birthday-reminder

Permission: Write jobs

A yearly call follow-up on the person's next birthday (9 AM, emailed that day). Save their birthday first (PATCH /v1/contacts/{contact_id}). Safe to repeat: an open one is moved to the right date. Returns 201 with "created": true the first time, 200 after.