Press8 Phone System API

Press8 phone service includes a JSON API. If you are building your own software (a case-management system, a CRM, a reporting dashboard), you can use the API to pull your call history, caller details, missed calls and voicemails, see calls that are in progress, and receive call events as they happen.

This page is a curated guide to the parts of the API that are most useful to customers. It covers read-only functions only.

Getting started

Get an API login

API calls are made with a user login on your Press8 account. Ask the administrator on your Press8 account to create a dedicated API user in the phone system portal and give it the permissions your integration needs (each function below lists the permission it requires). Please do not share a staff member’s personal login with your software.

What your login can see

Your API user’s credentials determine what you can reach. Every request is answered only with your own account’s data: your calls, voicemail, users, phones and numbers.

Your credentials also determine which functions you can call. Each function below lists the permission it needs. If your login does not have that permission, the API returns code 402 (“Your role does not allow this”). If the item you ask for does not exist on your account, it returns code 404. If you need a function your login cannot use, contact the administrator on your Press8 account to add that permission to your API user.

Base URL

All requests go to:

https://manage.press8.com/api/json/<category>/<action>/

Some functions have a longer path, such as calls/missed/list/. Always use HTTPS.

Making a request

The API is not strictly a REST API, but it works in a similar way. You can use HTTP GET (parameters in the URL) or HTTP POST (parameters sent as a form). GET parameters may be separated by & or ;.

We recommend POST, so that your password or token is not written into URLs, browser history or proxy logs. The GET examples on this page are for readability only.

Authentication

There are two ways to authenticate:

  1. Username and password on every request. Send auth_username and auth_password with each call.
  2. Token. Call user/login once with token=1. The response includes an auth_token value. Send that as the auth_token parameter on later calls instead of the username and password. Tokens are short-lived: the login response also includes auth_token_expires (a Unix timestamp). When the token expires, log in again to get a new one.

Keep API credentials on your server. Never put them in a web page or mobile app that your users can inspect.

Responses

Every response is a JSON document with a responses array. Each entry has a code, a key and a message. If there is data to return, it is in a data element: an array of records for list functions, or a single record for get functions.

{ "responses":[ { "code":"200", "key":"", "message":"OK" } ],
  "data":{ "id":123, "name":"example", ... } }

On an error there may be several responses (for example, one per invalid parameter) and usually no data. The key is a stable identifier you can match on in your code; the message is English text.

Two things to design for:

  • The order of fields and the formatting of the JSON are not guaranteed.
  • New fields and new optional parameters can be added at any time. Your code should ignore fields it does not recognise.

Response codes

CodeMeaning
200Success, and data is being returned.
204Success, and no data is being returned.
400Invalid input parameters. Check the key and message fields for details.
401The authentication details provided are invalid.
402Your role does not allow this.
403Your rate plan does not allow this.
404The object does not exist, or you do not have permission to view it.
500An error occurred within the server. Check the key and message fields for details.

Note that the code is inside the JSON responses array. Check it there rather than relying on the HTTP status of the request.

Times

Dates and times are Unix timestamps (seconds since 1 January 1970 UTC). Where a function takes start and end, it returns records at or after start and before end.

Which function do I need?

You wantUse
Call history (inbound, outbound, internal)cdrs/list, cdrs/get
Missed callscalls/missed/list
Voicemails and faxesmailboxes/list, messages/list, messages/get
Calls in progress right nowcalls/active/list
Calls as they happen, pushed to youCall events (see below)
Your users, extensions and phone numberspeople/list, phones/list, numbers/list

Reference

Every function below also takes the authentication parameters described above (auth_username and auth_password, or auth_token). They are not repeated in each table. Some rarely used or administrative parameters are left out.

user/login

Gets the login data for the authenticated user. Use it to check a login works, and with token=1 to get an authentication token.

Requires the user role privilege.

ParameterTypeDescriptionDefault
tokenInteger1 to get an authentication token, 0 not to.0

Example

https://manage.press8.com/api/json/user/login/?auth_username=USER&auth_password=PASSWORD&token=1
{ "responses":[ { "code":"200", "key":"", "message":"OK" } ],
  "data":{ "id":123, "username":"user", ... } }

The data is the fields of your user. With token=1 it also includes auth_token and auth_token_expires.

cdrs/list: call history

Gets the records of completed calls (CDRs) for your account.

Requires the cdrs or callshop role privilege.

Always send start and end. Leaving them out asks for every call ever made on the account, which is slow and puts a heavy load on the system. For regular syncing, ask for a small window (for example, the last hour or the last day) and page through with limit and offset.

ParameterTypeDescriptionDefault
startIntegerStart Unix timestamp. Recommended.0
endIntegerEnd Unix timestamp. Recommended.Now
detailString“call” to return a list of calls, “leg” to return a list of call legs.“leg”
directionString“in” (inbound only), “out” (outbound only), “internal” (internal only), “in_out” (inbound or outbound). Empty for all calls.Empty
callidStringCall ID. Empty for any.Empty
phoneStringSource telephone line. Empty for any.Empty
snumber, smatchStringSource (calling) number, and how to match it.Empty, “contains”
cnumber, cmatchStringCalled number, and how to match it.Empty, “contains”
dnumber, dmatchStringDestination number, and how to match it.Empty, “contains”
stype, ctype, dtypeStringSource, called and destination type. Empty for any.Empty
callername_number, callername_matchStringCaller name, and how to match it.Empty, “contains”
statusStringCall status. Empty for any.Empty
talktime_minimumIntegerMinimum talk time in seconds.0
talktime_maximumIntegerMaximum talk time in seconds. -1 for no limit.-1
archiveInteger1 to include archived calls, 0 not to.0
limitIntegerMaximum results to return. 0 for all.0
offsetIntegerThe result to start at. 0 for the first.0
sortStringField to sort by: “callid”, “cnumber”, “cost”, “ctype”, “dcustomer”, “direction”, “dnumber”, “dtype”, “end”, “name”, “peer”, “scustomer”, “snumber”, “start”, “status”, “stype”, “talktime”, “totaltime” or “uniqueid”.“start”
descendingInteger1 to sort descending, 0 not to.0

The match parameters accept “contains”, “start”, “end” or “exact”.

Example

https://manage.press8.com/api/json/cdrs/list/?auth_token=TOKEN&start=1759000000&end=1759086400&direction=in
{ "responses":[ { "code":"200", "key":"", "message":"OK" } ],
  "data":[
    { "uniqueid":"1234567890.123456", "start":1234567890, ... },
    { "uniqueid":"1234567890.123457", "start":1234567890, ... }
  ] }

By default there is one row per call leg; a single phone call that rings several phones or is transferred can have several legs. Each leg has its own uniqueid. All legs of one call share the same callid. Use detail=call if you want one row per call.

Fields returned: A complete field list is not published for this function. The example shows uniqueid and start, and the sort values above are field names. The easiest way to see everything is to run a small query against your own account and inspect the result.

cdrs/get: one call

Gets the fields of one completed call.

Requires the cdrs or callshop role privilege.

ParameterTypeDescriptionDefault
uniqueidStringRequired. Unique ID of the call to get.

Example

https://manage.press8.com/api/json/cdrs/get/?auth_token=TOKEN&uniqueid=1234567890.123456
{ "responses":[ { "code":"200", "key":"", "message":"OK" } ],
  "data":{ "uniqueid":"1234567890.123456", "start":1234567890, ... } }

Returns 404 if the call does not exist or you do not have permission to view it.

calls/missed/list: missed calls

Lists missed calls.

Requires the user, residential or wholesale role privilege.

ParameterTypeDescriptionDefault
startIntegerStart Unix timestamp. Recommended.0
endIntegerEnd Unix timestamp. Recommended.Now
dtypeStringDestination type. Recommended. Empty for any.Empty
dnumberStringDestination number. Recommended. Empty for any.Empty
cnumberStringThe caller ID to match.Empty
cmatchStringHow to match the caller ID: “exact”, “contains”, “start” or “end”.“contains”
sortString“callerid” or “time”.“time”
descendingInteger1 to sort descending, 0 not to.0

Leaving out start, end, dtype and dnumber can make the request slow.

Example (missed calls to telephone line 1234567)

https://manage.press8.com/api/json/calls/missed/list/?auth_token=TOKEN&start=1759000000&end=1759086400&dtype=phone&dnumber=1234567
{ "responses":[ { "code":"200", "key":"", "message":"OK" } ],
  "data":[
    { "time":1234567890, "callerid":"2125551234", ... },
    { "time":1234567891, "callerid":"2125551234", ... }
  ] }

A complete field list is not published for this function beyond time and callerid shown above.

mailboxes/list: your voicemail boxes

Gets the fields of all mailboxes visible to the user. Use this to find the mailbox numbers you need for messages/list.

Requires the user, features or residential role privilege. No extra parameters are needed.

Example

https://manage.press8.com/api/json/mailboxes/list/?auth_token=TOKEN
{ "responses":[ { "code":"200", "key":"", "message":"OK" } ],
  "data":[
    { "mailbox":"1234", "customer":2, ... },
    { "mailbox":"1235", "customer":2, ... }
  ] }

A single mailbox can be fetched with mailboxes/get and the mailbox parameter.

messages/list: voicemails and faxes in a mailbox

Lists the messages (voicemails, faxes and text messages) in a mailbox folder. The audio or fax files themselves are not included; use messages/get for those.

Requires the user, features or messages role privilege.

ParameterTypeDescriptionDefault
mailboxStringRequired. Mailbox containing the messages.
folderStringRequired. Folder containing the messages. Most commonly “INBOX”.
typeString“voicemail”, “fax” or “text”. Empty for any.Empty
callerStringOnly return messages whose caller ID or caller name contains this text.Empty
startIntegerOnly return messages received at or after this Unix timestamp.0
endIntegerOnly return messages received before this Unix timestamp.Now
duration_minimumIntegerOnly return voicemails at least this many seconds long.0
duration_maximumIntegerOnly return voicemails at most this many seconds long. -1 for no limit.-1
sortString“caller”, “duration” or “time”. Empty for unsorted.Empty
descendingInteger1 to sort descending, 0 not to.0

Example

https://manage.press8.com/api/json/messages/list/?auth_token=TOKEN&mailbox=1234&folder=INBOX&type=voicemail
{ "responses":[ { "code":"200", "key":"", "message":"OK" } ],
  "data":[
    { "name":"msg0001", "time":1234567890, ... },
    { "name":"msg0002", "time":1234567891, ... }
  ] }

Returns 404 if the mailbox does not exist. A complete field list is not published for this function beyond name and time shown above.

messages/get: download a voicemail or fax

Gets the fields of one voicemail or fax message, including the message file.

Requires the user, features or messages role privilege.

Important: by default this function marks the message as listened to, so it will no longer show as new. If your software is only copying messages, send listened=0.

ParameterTypeDescriptionDefault
mailboxStringRequired. Mailbox containing the message.
folderStringRequired. Folder containing the message. Most commonly “INBOX”.
messageStringRequired. Message file to get (the name from messages/list).
listenedInteger1 to mark the message as listened to, 0 not to.1
encodingString“base64” to return the file base64 encoded, “raw” to return raw data.“raw”
wrapString“json” to return the file in a JSON object, “none” to return the plain file.“json”

Example

https://manage.press8.com/api/json/messages/get/?auth_token=TOKEN&mailbox=1234&folder=INBOX&message=msg0001&listened=0&encoding=base64
{ "responses":[ { "code":"200", "key":"", "message":"OK" } ],
  "data":{ "name":"msg0001", "mimetype":"audio/x-wav", ... } }

calls/active/list: calls in progress

Lists calls that are active right now, one row per call leg.

Requires the user, telephone line reports or callshop role privilege.

ParameterTypeDescriptionDefault
directionString“in”, “out”, “internal” or “in_out” (inbound and outbound, not internal). Empty for all.Empty
callidStringThe call ID of a specific call.Empty
namesInteger1 to set number names, 0 not to.0
sortString“cnumber”, “ctype”, “direction”, “dnumber”, “dtype”, “machine”, “peer”, “scustomer”, “snumber”, “stype” or “uniqueid”.“start”
descendingInteger1 to sort descending, 0 not to.0

Example

https://manage.press8.com/api/json/calls/active/list/?auth_token=TOKEN
{ "responses":[ { "code":"200", "key":"", "message":"OK" } ],
  "data":[
    { "uniqueid":"1234567890.123456", "start":1234567890, ... },
    { "uniqueid":"1234567890.123457", "start":1234567890, ... }
  ] }

Commonly used fields:

FieldTypeDescription
uniqueidStringA unique identifier for the call leg.
callidStringA unique identifier for the call. All legs of the same call have the same callid.
startIntegerUnix timestamp the call started at.
answeredIntegerUnix timestamp the call was answered at. 0 if unanswered.
statusStringThe current status of the call.
snumber, stypeStringSource number and source type the call came from.
cnumberStringCalled number.
dnumber, dtypeStringDestination number and type the call is routed to.
callerid_external, callername_externalStringCaller ID number and name sent if routed to an external destination.
callerid_internal, callername_internalStringCaller ID number and name sent if routed to an internal destination.
recordingStringEmpty if the call is not being recorded.

people/list and people/get: users

people/list gets all users on your account. Passwords are not included. people/get gets one user.

Requires the user role privilege.

Parameter (people/list)TypeDescriptionDefault
countInteger1 to return a count, 0 to return full data.0
limitIntegerMaximum results to return. 0 for all.0
offsetIntegerThe result to start at. 0 for the first.0
sortString“forename”, “fullname”, “surname” or “username”.“username”
descendingInteger1 to sort descending, 0 not to.0
Parameter (people/get)TypeDescriptionDefault
idIntegerID of the person to get.0
usernameStringUser name of the person to get.
emailStringEmail address of the person to get.Empty

One of id, username or email must be given. If more than one user shares an email address, people/get by email returns 409, so prefer id or username.

Example

https://manage.press8.com/api/json/people/list/?auth_token=TOKEN
{ "responses":[ { "code":"200", "key":"", "message":"OK" } ],
  "data":[
    { "id":1, "username":"user1@example.com", ... },
    { "id":2, "username":"user2@example.com", ... }
  ] }

phones/list and phones/get: telephone lines (extensions)

phones/list gets the telephone lines visible to the user. phones/get gets one line by its name. Both return an extra field, display, which is the name of the line for display purposes.

Requires the user or residential role privilege (phones/get also accepts wholesale).

Parameter (phones/list)TypeDescriptionDefault
ownerInteger0: all lines for an administrator login, otherwise only lines owned by the calling user. -1: all lines. A person’s ID: lines owned by that person.0
countInteger1 to return a count, 0 to return full data.0
limitIntegerMaximum results to return. 0 for all.0
offsetIntegerThe result to start at. 0 for the first.0
sortString“description” or “name”.“name”
descendingInteger1 to sort descending, 0 not to.0

These functions can also return the lines’ SIP passwords if asked to. Your integration should not need them; please leave that option off.

Example

https://manage.press8.com/api/json/phones/list/?auth_token=TOKEN&owner=-1
{ "responses":[ { "code":"200", "key":"", "message":"OK" } ],
  "data":[
    { "id":1, "name":"1234567", ... },
    { "id":2, "name":"1234568", ... }
  ] }

numbers/list: your phone numbers

Gets all phone numbers on your account, with where each one is routed.

Requires the user or wholesale role privilege.

ParameterTypeDescriptionDefault
calleridInteger1 to return numbers that can be used as caller ID (including caller-ID-only numbers), 0 to return all normal numbers.0
countInteger1 to return a count, 0 to return full data.0
limitIntegerMaximum results to return. 0 for all.0
offsetIntegerThe result to start at. 0 for the first.0
sortString“destination”, “dnumber” or “number”.“number”
descendingInteger1 to sort descending, 0 not to.0

Example

https://manage.press8.com/api/json/numbers/list/?auth_token=TOKEN
{ "responses":[ { "code":"200", "key":"", "message":"OK" } ],
  "data":[
    { "number":"2125551234", "description":"example1", ... },
    { "number":"2125551235", "description":"example2", ... }
  ] }

Call event notifications

Your Press8 account can send a notification to a web address (URL) on your own server each time a call starts, is answered, or ends, including incoming calls. How the notifications work, what they contain and how to receive them is covered in Call Web URLs, which also covers Web URLs, where your server decides how individual calls are routed.

Per-call Web URLs are managed on the Web URLs page in the portal or with the urls API functions (urls/create, urls/update, urls/get, urls/list, urls/delete), which require the urls permission on your API user.

The API is how you set that web address. Use customers/update with your account ID (id) and the events_url parameter; an empty value turns notifications off. Your account ID is the customer field in the reply to user/login. This requires the administrator permission on your API user; if yours does not have it, contact the administrator on your Press8 account.

Important: customers/update treats a missing events_url as empty. Include your current events_url in every customers/update call, or notifications will stop. If the address does not take effect after a successful update, contact Press8 support to have the feature enabled on your account.

Because the address is itself a URL, encode it when passing it as a parameter. It can be up to 255 characters.

https://manage.press8.com/api/json/customers/update/?auth_token=TOKEN&id=ACCOUNT_ID&events_url=https%3A%2F%2Fyour.server.example%2Fpress8-events%3Fkey%3DYOUR_SECRET

For a list of missed calls after the fact, use calls/missed/list above.

Texting

Press8’s business texting service (SMS and MMS) is separate and is not covered by this API.

Help and good practice

  • Use a dedicated API login, keep its credentials on your server, and prefer POST over GET.
  • Always bound call history and missed call queries with start and end, and page large results with limit and offset.
  • Use listened=0 when copying voicemails, so staff still see them as new.
  • Ignore fields you do not recognise; the platform adds new ones over time.

For a new API user or additional permissions, contact the administrator on your Press8 account. If the API is not responding as described on this page, contact Press8 support.

Get notified of changes

Subscribe to receive an email each time these API instructions are revised. Subscriptions are available to contacts on a Press8 customer account.

Get API change notices

Press8 customers can get an email whenever this API changes. Enter the email address on your Press8 account.

We’ll email you a link to confirm. Every notice has a one-click unsubscribe link.

Revision history

Each change to these API instructions is listed here with its revision number. The first part of the revision number is the phone system version the instructions apply to; the second is the date and time of the revision (YYYYMMDD-HHMM, US Central time), so revisions always increase.

RevisionWhat changed
4.2-20260929-1004First publication.

Endpoint definitions courtesy of Integrics Ltd., our API integrator.

Back To
Request a Free Quote