Vocatech

By area

Callers

Read from the API’s own reference file every hour.

Plain text

Everything your account knows about one phone number, in one answer. Built for an AI agent or a screen pop that needs context before it answers.

Look up a caller

GET/v1/callers/{number}

Everything your account knows about one phone number: the contacts it belongs to (up to 5), recent calls with who handled them and the AI summary, recent texts and WhatsApp messages, and the last call each way. Built for an AI agent or a screen pop that needs context before it answers.

number can be written any way: punctuation and a leading 1 are ignored. It needs at least 7 digits.

Calls and messages look back days days and return up to limit of each, newest first. Transcripts are left out unless include asks for them; each is cut at 6,000 characters. Message text is cut at 400 characters. A cut ends in [cut].

Keys with the agents scope can call this route. Each request is written to your account's HIPAA access log.

Request

curl -G https://api.vocatech.com/v1/callers/7185550142 \
  -H "Authorization: Bearer YOUR_API_KEY" \
  --data-urlencode "days=90" \
  --data-urlencode "limit=10"

Parameters

NameInTypeDescription
number requiredpathstringThe phone number, any format, at least 7 digits. For example 7185550142.
daysqueryintegerHow far back to look, 1 to 365. A value outside that range is brought inside it. Default 90. From 1 to 365.
limitqueryintegerMost calls, and most messages, to return: 1 to 50. A value outside that range is brought inside it. Default 10. From 1 to 50.
includequerystringWhat to include, separated by commas: contacts, calls, messages, transcripts. transcripts brings the calls with it. Unknown words are ignored. Default contacts,calls,messages. For example contacts,calls,messages,transcripts.

Answers

200
What we know about the number.
FieldTypeDescription
number requiredstringThe number you asked about, digits only, without a leading 1.
days requiredintegerHow many days back the calls and messages go.
contacts requiredarray of objectsContacts with this number, up to 5. Up to 5 items.
contacts[].id requiredintegerThe contact's id.
contacts[].fields requiredobjectField name to value. The names are your contact fields (GET /v1/contacts/fields). Phone fields hold digits; several numbers are separated by ;.
contacts[].fields.{field}string or nullOne value for each field, by its name.
calls requiredarray of objectsNewest first.
calls[].call_id requiredstring
calls[].direction requiredstringincoming or outgoing.
calls[].status requiredstringThe first leg's status, as in GET /v1/calls.
calls[].start_time requiredstring (date-time) or null
calls[].end_time requiredstring (date-time) or null
calls[].duration requiredintegerSeconds.
calls[].remote_name requiredstring
calls[].remote_number requiredstring
calls[].our_number requiredstringYour number on the call.
calls[].handled_by requiredobject or nullThe person on your side: the last extension that held an incoming call, or the one that placed an outgoing call.
calls[].handled_by.extension requiredstring
calls[].handled_by.name requiredstring
calls[].summary requiredstring or nullThe first AI summary on the call.
calls[].journey requiredarray of objects
calls[].journey[].order requiredinteger
calls[].journey[].type requiredstring
calls[].journey[].extension requiredstring or null
calls[].journey[].extension_name requiredstring or null
calls[].journey[].start_time requiredstring (date-time) or null
calls[].journey[].duration requiredintegerSeconds.
calls[].journey[].summary requiredstring or nullThe AI summary of this leg, when recorded.
calls[].journey[].transcriptionstring or nullOnly with include=transcripts. Cut at 6,000 characters, ending in [cut].
messages requiredarray of objectsNewest first.
messages[].channel requiredstringOne of text or whatsapp.
messages[].direction requiredstringincoming or outgoing.
messages[].body requiredstringCut at 400 characters, ending in [cut].
messages[].sent_time requiredstringUTC, ISO 8601 without milliseconds.
messages[].our_number requiredstring
messages[].remote_number requiredstring
last_call requiredobject or nullThe newest call either way.
last_call.call_id requiredstring
last_call.direction requiredstringincoming or outgoing.
last_call.status requiredstringThe first leg's status, as in GET /v1/calls.
last_call.start_time requiredstring (date-time) or null
last_call.end_time requiredstring (date-time) or null
last_call.duration requiredintegerSeconds.
last_call.remote_name requiredstring
last_call.remote_number requiredstring
last_call.our_number requiredstringYour number on the call.
last_call.handled_by requiredobject or nullThe person on your side: the last extension that held an incoming call, or the one that placed an outgoing call.
last_call.handled_by.extension requiredstring
last_call.handled_by.name requiredstring
last_call.summary requiredstring or nullThe first AI summary on the call.
last_call.journey requiredarray of objects
last_call.journey[].order requiredinteger
last_call.journey[].type requiredstring
last_call.journey[].extension requiredstring or null
last_call.journey[].extension_name requiredstring or null
last_call.journey[].start_time requiredstring (date-time) or null
last_call.journey[].duration requiredintegerSeconds.
last_call.journey[].summary requiredstring or nullThe AI summary of this leg, when recorded.
last_call.journey[].transcriptionstring or nullOnly with include=transcripts. Cut at 6,000 characters, ending in [cut].
last_incoming requiredobject or nullThe newest incoming call.
last_incoming.call_id requiredstring
last_incoming.direction requiredstringincoming or outgoing.
last_incoming.status requiredstringThe first leg's status, as in GET /v1/calls.
last_incoming.start_time requiredstring (date-time) or null
last_incoming.end_time requiredstring (date-time) or null
last_incoming.duration requiredintegerSeconds.
last_incoming.remote_name requiredstring
last_incoming.remote_number requiredstring
last_incoming.our_number requiredstringYour number on the call.
last_incoming.handled_by requiredobject or nullThe person on your side: the last extension that held an incoming call, or the one that placed an outgoing call.
last_incoming.handled_by.extension requiredstring
last_incoming.handled_by.name requiredstring
last_incoming.summary requiredstring or nullThe first AI summary on the call.
last_incoming.journey requiredarray of objects
last_incoming.journey[].order requiredinteger
last_incoming.journey[].type requiredstring
last_incoming.journey[].extension requiredstring or null
last_incoming.journey[].extension_name requiredstring or null
last_incoming.journey[].start_time requiredstring (date-time) or null
last_incoming.journey[].duration requiredintegerSeconds.
last_incoming.journey[].summary requiredstring or nullThe AI summary of this leg, when recorded.
last_incoming.journey[].transcriptionstring or nullOnly with include=transcripts. Cut at 6,000 characters, ending in [cut].
last_outgoing requiredobject or nullThe newest outgoing call.
last_outgoing.call_id requiredstring
last_outgoing.direction requiredstringincoming or outgoing.
last_outgoing.status requiredstringThe first leg's status, as in GET /v1/calls.
last_outgoing.start_time requiredstring (date-time) or null
last_outgoing.end_time requiredstring (date-time) or null
last_outgoing.duration requiredintegerSeconds.
last_outgoing.remote_name requiredstring
last_outgoing.remote_number requiredstring
last_outgoing.our_number requiredstringYour number on the call.
last_outgoing.handled_by requiredobject or nullThe person on your side: the last extension that held an incoming call, or the one that placed an outgoing call.
last_outgoing.handled_by.extension requiredstring
last_outgoing.handled_by.name requiredstring
last_outgoing.summary requiredstring or nullThe first AI summary on the call.
last_outgoing.journey requiredarray of objects
last_outgoing.journey[].order requiredinteger
last_outgoing.journey[].type requiredstring
last_outgoing.journey[].extension requiredstring or null
last_outgoing.journey[].extension_name requiredstring or null
last_outgoing.journey[].start_time requiredstring (date-time) or null
last_outgoing.journey[].duration requiredintegerSeconds.
last_outgoing.journey[].summary requiredstring or nullThe AI summary of this leg, when recorded.
last_outgoing.journey[].transcriptionstring or nullOnly with include=transcripts. Cut at 6,000 characters, ending in [cut].
counts requiredobject
counts.contacts requiredinteger
counts.calls requiredinteger
counts.messages requiredinteger
Example
{
  "number": "7185550142",
  "days": 90,
  "contacts": [
    {
      "id": 5012,
      "fields": {
        "First Name": "Jordan",
        "Last Name": "Reyes",
        "Phone": "7185550142",
        "Email": "jordan.reyes@example.com",
        "Account Number": "A-2291"
      }
    }
  ],
  "calls": [
    {
      "call_id": "8a1f3c2e-5b7d-4e9a-9c1b-2d4e6f8a0b1c",
      "direction": "incoming",
      "status": "answered",
      "start_time": "2026-09-21T14:03:12.000Z",
      "end_time": "2026-09-21T14:09:40.000Z",
      "duration": 388,
      "remote_name": "Jordan Reyes",
      "remote_number": "7185550142",
      "our_number": "7185550100",
      "handled_by": {
        "extension": "104",
        "name": "Maya Chen"
      },
      "summary": "Jordan Reyes asked to move the Thursday appointment to Friday at 10 AM. Maya Chen confirmed the new time and said a reminder text will follow.",
      "journey": [
        {
          "order": 1,
          "type": "auto_attendant",
          "extension": "100",
          "extension_name": "Main Menu",
          "start_time": "2026-09-21T14:03:12.000Z",
          "duration": 19,
          "summary": null
        },
        {
          "order": 2,
          "type": "user",
          "extension": "104",
          "extension_name": "Maya Chen",
          "start_time": "2026-09-21T14:03:31.000Z",
          "duration": 369,
          "summary": "Jordan Reyes asked to move the Thursday appointment to Friday at 10 AM. Maya Chen confirmed the new time and said a reminder text will follow."
        }
      ]
    }
  ],
  "messages": [
    {
      "channel": "text",
      "direction": "incoming",
      "body": "Running 10 minutes late, see you soon.",
      "sent_time": "2026-09-21T15:22:04Z",
      "our_number": "7185550100",
      "remote_number": "7185550142"
    }
  ],
  "last_call": {
    "call_id": "8a1f3c2e-5b7d-4e9a-9c1b-2d4e6f8a0b1c",
    "direction": "incoming",
    "status": "answered",
    "start_time": "2026-09-21T14:03:12.000Z",
    "end_time": "2026-09-21T14:09:40.000Z",
    "duration": 388,
    "remote_name": "Jordan Reyes",
    "remote_number": "7185550142",
    "our_number": "7185550100",
    "handled_by": {
      "extension": "104",
      "name": "Maya Chen"
    },
    "summary": "Jordan Reyes asked to move the Thursday appointment to Friday at 10 AM. Maya Chen confirmed the new time and said a reminder text will follow.",
    "journey": [
      {
        "order": 1,
        "type": "auto_attendant",
        "extension": "100",
        "extension_name": "Main Menu",
        "start_time": "2026-09-21T14:03:12.000Z",
        "duration": 19,
        "summary": null
      },
      {
        "order": 2,
        "type": "user",
        "extension": "104",
        "extension_name": "Maya Chen",
        "start_time": "2026-09-21T14:03:31.000Z",
        "duration": 369,
        "summary": "Jordan Reyes asked to move the Thursday appointment to Friday at 10 AM. Maya Chen confirmed the new time and said a reminder text will follow."
      }
    ]
  },
  "last_incoming": {
    "call_id": "8a1f3c2e-5b7d-4e9a-9c1b-2d4e6f8a0b1c",
    "direction": "incoming",
    "status": "answered",
    "start_time": "2026-09-21T14:03:12.000Z",
    "end_time": "2026-09-21T14:09:40.000Z",
    "duration": 388,
    "remote_name": "Jordan Reyes",
    "remote_number": "7185550142",
    "our_number": "7185550100",
    "handled_by": {
      "extension": "104",
      "name": "Maya Chen"
    },
    "summary": "Jordan Reyes asked to move the Thursday appointment to Friday at 10 AM. Maya Chen confirmed the new time and said a reminder text will follow.",
    "journey": [
      {
        "order": 1,
        "type": "auto_attendant",
        "extension": "100",
        "extension_name": "Main Menu",
        "start_time": "2026-09-21T14:03:12.000Z",
        "duration": 19,
        "summary": null
      },
      {
        "order": 2,
        "type": "user",
        "extension": "104",
        "extension_name": "Maya Chen",
        "start_time": "2026-09-21T14:03:31.000Z",
        "duration": 369,
        "summary": "Jordan Reyes asked to move the Thursday appointment to Friday at 10 AM. Maya Chen confirmed the new time and said a reminder text will follow."
      }
    ]
  },
  "last_outgoing": null,
  "counts": {
    "contacts": 1,
    "calls": 1,
    "messages": 1
  }
}
400
Fewer than 7 digits.
Example body
Example
{
  "error": {
    "code": 400,
    "type": "BAD_REQUEST",
    "message": "number must contain at least 7 digits."
  }
}
401
No key, or a key that is wrong or turned off.
403
Refused. The key is scoped away from this route, the request came from an address not on the key's allow-list, or the route refused the request (the message says why).
429
A rate limit was reached. Wait Retry-After seconds. The body names the counter, the window and the limit.
HeaderTypeDescription
Retry-AfterintegerSeconds to wait before you try again.
503
Try again shortly. The key could not be checked just now (Retry-After: 5), or a service this route needs could not be reached.
HeaderTypeDescription
Retry-AfterintegerSeconds to wait before you try again.