Skip to content
TruTecDevelopers
Get an API key

Inbox & notifications

Read the email you sent customers and the replies that came back, see which replies still need an answer, and read your notifications, @mentions and the Daily Summary.

View as Markdown

These endpoints answer "did the customer reply?", "what's waiting on me?" and "what did the team do today?". They read what TruTec already has; none of them sends anything.

They work as the person who created the API key (a partner key acts as the workspace owner): you see the email that person can see in TruTec, and their notifications and mentions.

Emails#

The Emails page in TruTec puts every customer email in one list:

  • Sent: proposals, signature requests, invoices, schedule and warranty notices, automatic follow-ups, campaigns and emails people wrote, from a connected mailbox or TruTec's own sender. Internal mail (mailbox tests, owner reviews) is left out.
  • Received: customer replies TruTec filed on jobs.

A received email needs a reply until someone emails that address back or ticks it handled (answered by phone, nothing to answer). Automatic follow-ups don't count as an answer.

Someone limited to their own (or assigned) jobs sees the email on those jobs plus anything they sent; owners and people who see every job see everything.

The email object#

Field Type Description
id integer Unique within its direction. Use both to read it: GET /v1/emails/{direction}/{id}.
direction string sent or received.
at string When it was sent or arrived (UTC).
subject, snippet string snippet is the first line of what was written, when TruTec has it.
from, to, cc from is {name, email}; to and cc are addresses.
contact_name string The customer contact, when the address belongs to one.
type, type_group string A plain label (Proposal, Automatic follow-up, Reply) and, for sent email, the filter value (proposal, follow_up, ...).
automatic boolean An automatic follow-up.
job, company object {id, name} when known.
attachments array File names.
sent_by object Sent email: {id, name} of the person.
status string Received email: needs_reply, answered or handled.
needs_reply, overdue boolean overdue once it has waited more than 24 hours.
answered_at, handled_at, handled_by When it was answered (the first email to that address after it), or ticked handled and by whom.
in_reply_to_email_id integer Received email: the sent email it answers, when known.

List emails#

GET /v1/emails

Permission: Read jobs

Newest first.

Name Type Required Description
direction string No all (default), sent or received.
needs_reply boolean No Only customer email still waiting on you, from the last 60 days.
job_id integer No Only email about this job.
type string No Sent email kind: proposal, signature, signed, email, follow_up, campaign, quote_request, quote_accepted, schedule, warranty, agreement, invoice.
include_automatic boolean No false hides automatic follow-ups.
mine boolean No Only mail you sent, or on jobs you own.
q string No Search sender, recipient, subject, job or company.
limit, offset integer No Default 50, maximum 200.
curl "https://trutec.ai/api/v1/emails?job_id=70412&direction=received" \
  -H "X-API-Key: sk_your_api_key_here"
{
  "data": [
    {
      "id": 88213,
      "direction": "received",
      "at": "2026-10-12T18:22:05Z",
      "subject": "Re: Proposal for Northgate Plaza reseal",
      "snippet": "Looks good. Can you start the week of the 3rd?",
      "from": { "name": "Pat Lee", "email": "[email protected]" },
      "to": ["[email protected]"],
      "contact_name": "Pat Lee",
      "type": "Reply",
      "job": { "id": 70412, "name": "Northgate Plaza reseal" },
      "company": { "id": 5120, "name": "Northgate Properties" },
      "status": "needs_reply",
      "needs_reply": true,
      "overdue": false,
      "in_reply_to_email_id": 77120
    }
  ],
  "pagination": { "total": 1, "limit": 50, "offset": 0 }
}

Get an email and its conversation#

GET /v1/emails/{direction}/{id}

Permission: Read jobs

The email plus every email to or from the same person with the same subject (Re: and Fwd: ignored) within 120 days, oldest first, up to 40 (earlier_count says how many older ones were left out). Each message has body (the words TruTec kept) and body_state:

body_state Meaning
ready body is the whole email.
fetch Only part was kept; read the whole email with the body endpoint below.
reconnect It's in a mailbox that needs reconnecting in TruTec.
preview Only the start of a reply was kept and no mailbox can supply more.
none Sent before TruTec kept copies of emails.

reply_to names who to answer and a Re: subject.

Read a whole email#

GET /v1/emails/{direction}/{id}/body

Permission: Read jobs

Reads the email from the workspace's connected mailbox the first time (TruTec keeps it after that), like opening it in the email window. state is ready with text and display-safe html, or unavailable with a reason (reconnect, gone, busy, error) and a message.

Mark an email handled#

POST /v1/emails/received/{id}/mark-handled

Permission: Write jobs

Ticks a received email handled so it leaves Needs reply. Send {"handled": false} to put it back. Returns the email.

Mark many emails handled#

POST /v1/emails/mark-handled

Permission: Write jobs

{"email_ids": [88213, 88240], "handled": true}, up to 500 received email ids. Every id must be a received email the key's creator can see; otherwise nothing changes and the 404 lists the ids.

Notifications#

The bell in TruTec: schedule changes, crew and customer messages, field alerts and reminders such as a warranty packet waiting to be sent. They come with scheduling and crews; a workspace without them gets 403. Mentions in team notes are separate (below).

Field Type Description
id integer
kind, title, body string
link string Where it points in TruTec.
read, read_at, created_at

List notifications#

GET /v1/notifications

Permission: Read jobs

Newest first. unread=true for unread only. limit, offset. The response also has unread, the unread count.

Mark a notification read#

POST /v1/notifications/{id}/mark-read

Permission: Write jobs

Mark all notifications read#

POST /v1/notifications/mark-all-read

Permission: Write jobs

Mentions#

Team notes where someone tagged the key's creator, as in the Mentions inbox. Office members only (403 otherwise).

Field Type Description
id integer
read boolean
job object {id, name}.
scope string Job, or the service or visit the note is about.
note_id integer The note.
author object {id, name}.
content, created_at, link

List mentions#

GET /v1/mentions

Permission: Read jobs

Newest first. unread=true for unread only. The response also has unread.

Mark a mention read#

POST /v1/mentions/{id}/mark-read

Permission: Write jobs

Daily Summary#

Get the daily summary#

GET /v1/daily-summary

Permission: Read jobs

The dashboard's Daily Summary card: what happened in a local period, counted and listed. Jobs are fenced to what the key's creator can see.

Name Type Required Description
period string No today (default), yesterday, week (from Monday) or month.
who string No team (default), me (only what the key's creator did) or members (with member_ids).
member_ids string No Comma-separated user ids, with who=members.
scope string No all (default) or mine (only jobs the key's creator owns).
timezone string No IANA zone for the day boundaries, e.g. America/Chicago. Default: the workspace's.

counts has new_leads, status_changes, emails, calls, won, lost, site_visits, followups and takeoff_minutes. items lists up to 100 activities, newest first, each with kind, local time, who, text, detail and link. For week and month, people has the same counts per person.

{
  "data": {
    "period": "today",
    "period_label": "Today",
    "date_label": "Tue, Oct 13",
    "timezone": "America/Chicago",
    "who": "team",
    "counts": { "new_leads": 3, "status_changes": 5, "emails": 12, "calls": 7, "won": 1, "lost": 0,
                "site_visits": 2, "followups": 4, "takeoff_minutes": 95 },
    "items": [
      { "kind": "won", "time": "2:05 PM", "who": "Office Manager",
        "text": "Status: Proposal Sent → Won · Northgate Plaza reseal", "detail": null,
        "link": "https://trutec.ai/jobs/70412" }
    ],
    "has_activity": true
  }
}

Errors: 400 a bad filter value; 403 missing permission, the key's creator is no longer in the workspace, or the feature isn't available to them; 404 an id that isn't in this workspace or that the key's creator can't see.