Pushbullet API

Pushbullet's API enables developers to build on the Pushbullet infrastructure. Our goal is to provide a full API that enables anything to tap into the Pushbullet network.
This is important to us because we believe everything, not just smartphones and computers, should be able to exchange information in real time. Here are some of the things you can build with Pushbullet:
Check out this ProgrammableWeb article for a longer introduction to Pushbullet and this API.

Sections

Problems/Feedback

If you have questions, feel free to post them to the pushbullet tag on Stack Overflow. We monitor this tag and will reply as quickly as we can.
For everything else (including incorrect things or suggested changes to these docs) feel free to contact us at [email protected].

API Quick Start

All of our examples use the curl command line tool already available on most systems.
The Pushbullet API lets you send/receive pushes and do everything else the official Pushbullet clients can do. To access the API you'll need an access token so the server knows who you are. You can get one from your Account Settings page.
Once you have that access token, you can use it to access your Pushbullet account using the Pushbullet API:
Example: Get Current User
Request
curl --header 'Access-Token: <your_access_token_here>' \
     https://api.pushbullet.com/v2/users/me
Response
{
  "created": 1381092887.398433,
  "email": "[email protected]",
  "email_normalized": "[email protected]",
  "iden": "ujpah72o0",
  "image_url": "https://static.pushbullet.com/missing-image/55a7dc-45",
  "max_upload_size": 26214400,
  "modified": 1441054560.741007,
  "name": "Elon Musk"
}

API Overview

Requests

The API accepts requests over HTTPS at https://api.pushbullet.com. All POST requests must use a JSON body with the Content-Type header set to application/json. Most programming languages have some way to encoded objects to JSON, and using the built-in library is recommended, since it will correctly handle newline characters and quotes.

Authentication

To authenticate for the API, use your access token in a header like Access-Token: <your_access_token_here>. Your access token can be found on the Account Settings page. Keep in mind that this key has full access to your account, so don't go posting it all over the internets.
If you are making an app that uses the Pushbullet API on behalf of another user (for instance, to send push notifications as that user), use OAuth to get an access token for that user. Using your own access token while developing though saves you from having to setup OAuth until later.
You can make a request from any app, though how you do that may depend on if you are writing a script or using a programming language. If you have a terminal and the curl utility you can perform requests from the command line.
Example: Get Current User
Request
curl --header 'Access-Token: <your_access_token_here>' \
     https://api.pushbullet.com/v2/users/me
Response
{
  "created": 1381092887.398433,
  "email": "[email protected]",
  "email_normalized": "[email protected]",
  "iden": "ujpah72o0",
  "image_url": "https://static.pushbullet.com/missing-image/55a7dc-45",
  "max_upload_size": 26214400,
  "modified": 1441054560.741007,
  "name": "Elon Musk"
}
Because we allow CORS requests, you can make a request from any browser (you can hit the run button or copy and paste this code into your javascript console):

Responses

Responses are always JSON. Keys are either present with a non-empty value, or entirely absent from the response. Empty values are: null, false, "", [], and {}. Deleted objects will only have the keys iden, active, created, and modified because all other properties have been removed and are now empty values.
Example: API Response
{
  "created": 1357941753.82879,
  "email": "[email protected]",
  "email_normalized": "[email protected]",
  "iden": "ujpah72o0sjAoRtnM0jc",
  "modified": 1399325992.18423
}

HTTP Status Codes

Errors

Error responses (any non-200 error code) contain information on the kind of error that happened. The response JSON will have an error property with the following fields:
Example: Error Response
{
  "error": {
    "cat": "~(=^‥^)",
    "message": "The resource could not be found.",
    "type": "invalid_request"
  }
}
Errors from the Pushbullet server will have this JSON body. Errors from intermediate servers or the hosting infrastructure may not, so you should be able to handle a non-JSON response as a generic error.

Objects

Objects (such as pushes and devices) can be created, modified, listed and deleted.
All timestamps that appear on objects are floating point seconds since the epoch, also called Unix Time.
All calls to list objects (list-*) accept the active, limit, and cursor parameters.

Bootstrapping

By default, listing objects of any type will return deleted objects (this is useful for syncing). When you are getting the initial list of objects, you may want to only fetch the active ones. To get only active objects, set active to true on the request.

Pagination

When listing objects, if you receive a cursor in the response, it means the results are on multiple pages. To request the next page of results, use this cursor as the parameter cursor in the next request. Any time you list a collection of objects, they may be multiple pages (objects are always returned with the most recent ones first). You can specify a limit parameter on any calls that return a list of objects to get a smaller number of objects on each page. The default (maximum) limit is 500, including deleted objects.

Syncing Changes

All calls to list objects accept a modified_after property (a timestamp). Any objects modified since that time will be returned, most recently modified first. The modified_after parameter should be the most recent modified value from an object returned by the server (don't trust the local machine's timestamp as it usually is not the same value as the server).

Deleted Objects

When you query with a modified_after timestamp to sync changed objects to a device, you need to know if an object was deleted so you can remove it locally. Deleted objects will have active=false and all properties except for iden, created, modified, and active will be missing from the returned object. Deleted objects show up by default when listing objects.

Resizing Images

Pushes have an image_url property that can be resized by setting query parameters. To use this, add =s<pixels> to the end of the url.
Example: Resize an Image
Resize the image so that the longest side is not longer than 100 pixels
Before
https://lh3.googleusercontent.com/kR7yrU5ioduH9D0LGM1qr6GAPxFv6gybYmIvQwxwhvIkDj_hJA1GrwP4pqOn5wW5Hawp-kvNGWEHch4AAo6aiUGcug
After
https://lh3.googleusercontent.com/kR7yrU5ioduH9D0LGM1qr6GAPxFv6gybYmIvQwxwhvIkDj_hJA1GrwP4pqOn5wW5Hawp-kvNGWEHch4AAo6aiUGcug=s100
The image_url should be hosted on domain ending with .googleusercontent.com. If the domain does not end with that, you should not attempt to resize the image with a query parameter. Objects besides pushes have an image_url property but they cannot necessarily be resized the same way.

Backwards Compatibility

We try to make only backwards compatible changes to existing public API calls. This means that we should not change the meaning of existing calls, and that we will only add, not remove, keys from objects returned from the API. Adding a key is considered to be a backwards-compatible change.

Limits

Ratelimiting

When you do a request to the API you will receive headers like the following on the response:
X-Ratelimit-Limit: 32768
X-Ratelimit-Remaining: 32765
X-Ratelimit-Reset: 1432447070
These tell you what the ratelimit is, how much you have remaining and when it resets (integer seconds in Unix Time). The units are a sort of generic 'cost' number. A request costs 1 and a database operation costs 4. So reading 500 pushes costs about 500 database operations + 1 request = 500*4 + 1 = 2001. You can see how much a request cost by the change in X-Ratelimit-Remaining between two requests.

Push limit

Free accounts (without a Pro subscription) are limited to 500 pushes per month. Going over will result in an error when sending a Push.

Guides

OAuth2

Overview

OAuth lets you access a user's Pushbullet account or have them authenticate with their Pushbullet account using a browser.
OAuth is a standard authentication procedure used by most websites, here's how it works:
  1. You, the app developer, register your app (called an "OAuth client") with Pushbullet
  2. Using a url you generate in your app (you can see an example one on the Create Client page) you send the user to the Pushbullet site. One of the parameters of the url is a redirect url that the user will be sent to when they are done authorizing your app.
  3. The user authorizes your application by clicking the "Allow" button.
  4. The user is redirected to the redirect url you provided earlier, which is generally your site or your app.
Here's roughly how this looks with pictures:

Getting Started

To get started, create a client (register your application) on the Create Client page. For the examples on this page, the client looks like this:
EXAMPLE CLIENT
{
  "client_id": "YW7uItOzxPFx8vJ4",
  "client_secret": "MmA98EDg0pjr4fZw",
  "iden": "ujpah72o0sjAoRtnM0jc",
  "image_url": "http://www.catpusher.com/logo.png",
  "name": "Cat Pusher",
  "redirect_uri": "http://www.catpusher.com/auth_complete",
  "website_url": "http://www.catpusher.com"
}

Getting an Access Token

Once you've created a client, you can send a user to https://www.pushbullet.com/authorize with the following parameters:
EXAMPLE URL
https://www.pushbullet.com/authorize?client_id=YW7uItOzxPFx8vJ4&redirect_uri=http%3A%2F%2Fwww.catpusher.com%2Fauth_complete&response_type=code
NOTE: There's an example url ("oauth test url") on the Create Client page for your app.
When the user is sent to this page, they are able to authorize or deny your application. If they choose deny, they get redirected to the redirect_uri with the parameter "error=access_denied".
If they chose authorize, there are two possible next steps, depending on the value of response_type:

For Client-Side Apps: response_type=token

The user is redirected to the redirect_uri with a url fragment of "access_token=<access_token>". If you have a client side app running an embedded web browser, you can configure your redirect_uri to be "https://www.pushbullet.com/login-success" and then use this redirect_uri in the authorize call.
EXAMPLE URL
https://www.pushbullet.com/authorize?client_id=YW7uItOzxPFx8vJ4&redirect_uri=https%3A%2F%2Fwww.pushbullet.com%2Flogin-success&response_type=token
EXAMPLE REDIRECT
https://www.pushbullet.com/login-success#access_token=o.RUe7IZgC6384GrI1

For Apps with Servers: response_type=code

If you have a server you can use this response_type, it's potentially more secure than the client-side one, since the client never sees the actual access token. In this mode the user is redirected to the redirect_uri with a parameter "code=<code>".
EXAMPLE URL
https://www.pushbullet.com/authorize?client_id=YW7uItOzxPFx8vJ4&redirect_uri=http%3A%2F%2Fwww.catpusher.com%2Fauth_complete&response_type=code
EXAMPLE REDIRECT
http://www.catpusher.com/auth_complete?code=RUe7IZgC6384GrI1
Your server then peforms a POST request to https://api.pushbullet.com/oauth2/token with the following parameters:
Example: Convert Code to Access Token
Request
curl --header 'Access-Token: <your_access_token_here>' \
     --header 'Content-Type: application/json' \
     --data-binary '{"client_id":"YW7uItOzxPFx8vJ4","client_secret":"MmA98EDg0pjr4fZw","code":"RUe7IZgC6384GrI1","grant_type":"authorization_code"}' \
     --request POST \
     https://api.pushbullet.com/oauth2/token
Response
{
  "access_token": "a6FJVAA0LVJKrT8k",
  "token_type": "Bearer"
}
You can add extra query params to the end of redirect_uri if you need to store extra state for the request. For instance, if you have your client's redirect_uri set to http://www.catpusher.com/auth_complete, then when you build the url to send the user to Pushbullet, you could specify redirect_uri=http://www.catpusher.com/auth_complete?state=zhk2KJ3SAAS3q1. When the user finishes authorizing your app, they would end up at http://www.catpusher.com/auth_complete?state=zhk2KJ3SAAS3q1&code=RUe7IZgC6384GrI1.

Using Your Access Token

Now that you have an access token, you can access Pushbullet as that user. Just include the access_token with your requests as the username in HTTP Basic Auth or set the Access-Token header to your access_token. Make sure to keep the access_token in a safe place, it allows access to your users accounts!
Example: Get Current User
Request
curl --header 'Access-Token: <your_access_token_here>' \
     https://api.pushbullet.com/v2/users/me
Response
{
  "created": 1381092887.398433,
  "email": "[email protected]",
  "email_normalized": "[email protected]",
  "iden": "ujpah72o0",
  "image_url": "https://static.pushbullet.com/missing-image/55a7dc-45",
  "max_upload_size": 26214400,
  "modified": 1441054560.741007,
  "name": "Elon Musk"
}
The access_token does not have a set expiration time, but may be expired at some point in the future. If you delete your client, all existing tokens are invalidated.

End-to-End Encryption

We support end-to-end encryption for Notification Mirroring, Universal Copy & Paste, and SMS. We use client-side symmetric encryption for this. No keys are ever sent to the server, not even public keys, which is especially nice from a security standpoint.
The encryption is used primarily for ephemerals. If you enable it in your Pushbullet client, you should be able to see the encrypted messages on the stream whenever you use any of the features that support end-to-end encryption.

Key Generation

The key is created from a user-supplied password and passed through PBKDF2:
Code Sample: Generate an Encryption/Decryption Key
This example uses the javascript Forge library
var pseudorandom_function = forge.md.sha256.create();
var password = "hunter2";
var salt = "up0snaKOsn";
var iterations = 30000;
var derived_key_length_bytes = 32; // 256-bit
var key = forge.pkcs5.pbkdf2(
  password,
  salt,
  iterations,
  derived_key_length_bytes,
  pseudorandom_function
)
// encode to base64 so we can easily print the key
// (normally it's in binary and can't be printed)
var base64_key = btoa(key);
console.log("base64_key:", base64_key);

Encryption

To encrypt a message, use AES-256 with GCM Authentication. AES-256 uses the 256-bit key that is output by PBKDF2. To encrypt you need to generate a 96-bit initialization vector (this is used to start the encryption process, it is not a secret). The output of AES-256 with GCM will be the encrypted message (arbitrary length) and a 128-bit tag. The encoding for this encrypted message looks like this:
encoded_message = "1" + tag + initialization_vector + encrypted_message
The 1 prefix is a version number indicating the version of the encoding. When encoded_message is put into JSON, it must be base64-encoded since JSON cannot handle binary data.
Code Sample: Encrypt a Message
This example uses the javascript Forge library
// convert key from base64 to binary
var key = atob("1sW28zp7CWv5TtGjlQpDHHG4Cbr9v36fG5o4f74LsKg=");
var initialization_vector = forge.random.getBytes(12); // 96-bit
var message = "meow!";

var cipher = forge.cipher.createCipher('AES-GCM', key);
cipher.start({"iv": initialization_vector});
cipher.update(forge.util.createBuffer(forge.util.encodeUtf8(message)));
cipher.finish();

var tag = cipher.mode.tag.getBytes();
var encrypted_message = cipher.output.getBytes();

var encoded_message = "1" + tag + initialization_vector + encrypted_message;
var base64_encoded_message = btoa(encoded_message);
console.log("base64_encoded_message:", base64_encoded_message);

Decryption

If you can encrypt a message, decrypting it is straightforward. You need to decode the encoded_message into the tag, initialization_vector, and encrypted_message.
Code Sample: Decrypt an Encrypted Message
This example uses the javascript Forge library
var key = atob("1sW28zp7CWv5TtGjlQpDHHG4Cbr9v36fG5o4f74LsKg=");
var encoded_message = atob("MSfJxxY5YdjttlfUkCaKA57qU9SuCN8+ZhYg/xieI+lDnQ==");

var version = encoded_message.substr(0, 1);
var tag = encoded_message.substr(1, 16); // 128 bits
var initialization_vector = encoded_message.substr(17, 12); // 96 bits
var encrypted_message = encoded_message.substr(29);

if (version != "1") {
  throw "invalid version"
}

var decipher = forge.cipher.createDecipher('AES-GCM', key);
decipher.start({
    'iv': initialization_vector,
    'tag': tag
});
decipher.update(forge.util.createBuffer(encrypted_message));
decipher.finish();

var message = decipher.output.toString('utf8');
console.log("message:", message);
    
Make sure your encryption library is checking the validity of the tag parameter by using an incorrect tag and verifying that you get some sort of error. You must also discard any encoded_message without a prefix of 1 as those will be different, incompatible encodings in the future.

Encrypted Ephemeral Format

An ephemeral that looks like this:
{
  "push": {
    "data": {
      "key1": "value1",
      "key2": "value2"
    }
  },
  "type": "push"
}
Will look like this when encrypted:
{
  "push": {
    "ciphertext": "MXAdvN64uXWtLXCRaqYHEtGhiogR1VHyXX21Lpjp4jv3v+JWygMBA9Wp5npbQdfeZAgOZI+JT3y3pbmq+OrKXrK1rg==",
    "encrypted": true
  },
  "type": "push"
}
Where ciphertext is the base64_encoded_message from the encryption example.
If you decode ciphertext then you will get the following javascript object:
{
  "key1": "value1",
  "key2": "value2"
}

Realtime Event Stream

Connect to the stream

You can connect to the websocket for an account by creating a secure websocket connection (wss://) to wss://stream.pushbullet.com/websocket/<your_access_token_here>
Live jsFiddle example
Once you are connected, you will see type="nop" messages periodically as well as other types if you send any ephemerals or pushes.

Stream Messages

All messages are JSON objects with a type key.

Types

EXAMPLE MESSAGES
{
  "type": "nop"
}
{
  "subtype": "push",
  "type": "tickle"
}
{
  "push": {
    "cat": "meow"
  },
  "type": "push"
}

Push message types

A message with type="push" will contain a data object mapped to by the key push. This object is documented here based on its internal type.
EXAMPLE NOTIFICATION MIRROR
{
  "push": {
    "application_name": "Pushbullet",
    "body": "If you see this on your computer, mirroring is working!\n",
    "created": 1399350964.16497,
    "dismissable": true,
    "icon": "iVBORw0KGgoAAAANSUhEBgUzC42AAAADNElEQVRo\ng==\n",
    "iden": "1e443556ba3217c",
    "notification_id": "-8",
    "notification_tag": null,
    "package_name": "com.pushbullet.android",
    "receiver_email": "[email protected]",
    "receiver_email_normalized": "[email protected]",
    "receiver_iden": "ujpah72o0",
    "sender_email": "[email protected]",
    "sender_email_normalized": "[email protected]",
    "sender_iden": "ujpah72o0",
    "source_device_iden": "ujpah72o0sjAoRtnM0jc",
    "title": "Mirroring test",
    "type": "mirror"
  },
  "type": "push"
}
EXAMPLE NOTIFICATION DISMISSAL
{
  "push": {
    "created": 1399350966.22458,
    "iden": "1e443556ba3217c",
    "notification_id": "-8",
    "notification_tag": null,
    "package_name": "com.pushbullet.android",
    "receiver_email": "[email protected]",
    "receiver_email_normalized": "[email protected]",
    "receiver_iden": "ujpah72o0",
    "sender_email": "[email protected]",
    "sender_email_normalized": "[email protected]",
    "sender_iden": "ujpah72o0",
    "source_device_iden": "ujpah72o0sjAoRtnM0jc",
    "type": "dismissal"
  },
  "type": "push"
}

Reacting to tickles

When you receive a tickle message, it means that a resource of the type subtype has changed. This is your cue to update that resource. Here's an example for the pushes type:
On receiving this message:
{
  "subtype": "push",
  "type": "tickle"
}
Request the pushes that have changed since the last time we received them:
GET https://api.pushbullet.com/v2/pushes?modified_after=1399008037.849
Then merge these updates into your local copy of the push history.
Note: It's best to use the most recently modified local push's modified timestamp when making requests for updates. This will keep the responses small and fast. Additionally, don't trust the local machine's current timestamp because it is inevitably different from the server's timestamp. Use the latest timestamp you have seen on a push object instead. Since pushes are returned with most recently modified first, this will be the first push you get from any call to list-pushes.

Ephemerals

You can send arbitrary JSON messages, called "ephemerals", to all devices on your account. Ephemerals are stored for a short period of time (if at all) and are sent directly to devices. Because they are sent directly, there is no "tickle" message like when creating or updating pushes or other objects, the JSON message appears directly in the stream.
Ephemerals are used by the Pushbullet apps for notification mirroring and universal copy/paste.
Unlike some of the other HTTP endpoints, POST parameters are not supported for ephemerals due to their JSON structure.

Send an ephemeral

Parameters

Example: Send Ephemeral
Request
curl --header 'Access-Token: <your_access_token_here>' \
     --header 'Content-Type: application/json' \
     --data-binary '{"push":{"cat":"meow"},"type":"push"}' \
     --request POST \
     https://api.pushbullet.com/v2/ephemerals
Response
{}
Ephemerals respond with an empty JSON object unless there is an error.

Send SMS

DEPRECATED - see create-text for a more reliable method of sending SMS and MMS.
You can send an SMS from your phone by sending an ephemeral message to your phone.

SMS Ephemeral

EXAMPLE
{
  "push": {
    "conversation_iden": "+1 303 555 1212",
    "message": "Hello!",
    "package_name": "com.pushbullet.android",
    "source_user_iden": "ujpah72o0",
    "target_device_iden": "ujpah72o0sjAoRtnM0jc",
    "type": "messaging_extension_reply"
  },
  "type": "push"
}

Mirrored Notifications

Mirrored notifications are notifications sent from android devices (currently the only source of mirrored notifications) to other devices. To test these out you can go into the android app's settings screen and hit the button "Send a test notification" while listening to the stream.

Notification Ephemeral

EXAMPLE
{
  "push": {
    "application_name": "Pushbullet",
    "body": "If you see this on your computer, Android-to-PC notifications are working!\n",
    "client_version": 125,
    "dismissable": true,
    "has_root": false,
    "icon": "(base64_encoded_jpeg)",
    "notification_id": "-8",
    "notification_tag": null,
    "package_name": "com.pushbullet.android",
    "source_device_iden": "ujpah72o0sjAoRtnM0jc",
    "source_user_iden": "ujpah72o0",
    "title": "Mirroring test",
    "type": "mirror"
  },
  "type": "push"
}

Dismissal Ephemeral

EXAMPLE
{
  "push": {
    "notification_id": "-8",
    "notification_tag": null,
    "package_name": "com.pushbullet.android",
    "source_user_iden": "ujpah72o0",
    "type": "dismissal"
  },
  "type": "push"
}
Example: Dismiss Notification
Request
curl --header 'Access-Token: <your_access_token_here>' \
     --header 'Content-Type: application/json' \
     --data-binary '{"push":{"notification_id":"-8","notification_tag":null,"package_name":"com.pushbullet.android","source_user_iden":"ujpah72o0","type":"dismissal"},"type":"push"}' \
     --request POST \
     https://api.pushbullet.com/v2/ephemerals
Response
{}

Universal Copy/Paste

The Pushbullet apps can monitor the clipboard and send out a message each time the user copies a new text selection, sending it to all the user's devices which can copy it to the system clipboard or otherwise make it available to the user.

Copy a String to the Clipboard

Properties

Example

{
  "push": {
    "body": "http://www.google.com",
    "source_device_iden": "ujpah72o0sjAoRtnM0jc",
    "source_user_iden": "ujpah72o0",
    "type": "clip"
  },
  "type": "push"
}
Example: Send Clipboard Content
Request
curl --header 'Access-Token: <your_access_token_here>' \
     --header 'Content-Type: application/json' \
     --data-binary '{"push":{"body":"http://www.google.com","source_device_iden":"ujpah72o0sjAoRtnM0jc","source_user_iden":"ujpah72o0","type":"clip"},"type":"push"}' \
     --request POST \
     https://api.pushbullet.com/v2/ephemerals
Response
{}

Chat

Chats are created whenever you send a message to someone or a receive a message from them and there is no existing chat between you and the other user.
FieldTypeDescription
idenstringUnique identifier for this object
Example: "ujpah72o0sjAoRtnM0jc"
activeboolfalse if the item has been deleted
Example: true
createdfloatCreation time in floating point seconds (unix timestamp)
Example: 1381092887.398433
modifiedfloatLast modified time in floating point seconds (unix timestamp)
Example: 1441054560.741007
mutedboolIf true, notifications from this chat will not be shown
Example: false
withobjectThe user or email that the chat is with
 ↳ emailstringEmail address of the person
Example: "[email protected]"
 ↳ email_normalizedstringCanonical email address of the person
Example: "[email protected]"
 ↳ idenstringIf this is a user, the iden of that user
Example: "ujlMns72k"
 ↳ image_urlstringImage to display for the person
Example: "https://dl.pushbulletusercontent.com/foGfub1jtC6yYcOMACk1AbHwTrTKvrDc/john.jpg"
 ↳ typestring"email" or "user"
Example: "user"
 ↳ namestringName of the person
Example: "John Carmack"
Example
{
  "active": true,
  "created": 1412047948.579029,
  "iden": "ujpah72o0sjAoRtnM0jc",
  "modified": 1412047948.579031,
  "with": {
    "email": "[email protected]",
    "email_normalized": "[email protected]",
    "iden": "ujlMns72k",
    "image_url": "https://dl.pushbulletusercontent.com/foGfub1jtC6yYcOMACk1AbHwTrTKvrDc/john.jpg",
    "name": "John Carmack",
    "type": "user"
  }
}

list-chats

Get a list of chats belonging to the current user. If you have a large number of chats, you will need to use Pagination.
Call
GET https://api.pushbullet.com/v2/chats
Request
none
Response
FieldTypeDescription
chats[]ChatArray of Chat objects ordered with most recently modified first
Example
Request
curl --header 'Access-Token: <your_access_token_here>' \
     https://api.pushbullet.com/v2/chats
Response
{
  "chats": [
    {
      "active": true,
      "created": 1412047948.579029,
      "iden": "ujpah72o0sjAoRtnM0jc",
      "modified": 1412047948.579031,
      "with": {
        "email": "[email protected]",
        "email_normalized": "[email protected]",
        "iden": "ujlMns72k",
        "image_url": "https://dl.pushbulletusercontent.com/foGfub1jtC6yYcOMACk1AbHwTrTKvrDc/john.jpg",
        "name": "John Carmack",
        "type": "user"
      }
    }
  ]
}

create-chat

Create a chat with another user or email address if one does not already exist.
Call
POST https://api.pushbullet.com/v2/chats
Request
FieldTypeDescription
emailstringEmail of person to create chat with (does not have to be a Pushbullet user)
Response
Chat object
Example
Request
curl --header 'Access-Token: <your_access_token_here>' \
     --header 'Content-Type: application/json' \
     --data-binary '{"email":"[email protected]"}' \
     --request POST \
     https://api.pushbullet.com/v2/chats
Response
{
  "active": true,
  "created": 1412047948.579029,
  "iden": "ujpah72o0sjAoRtnM0jc",
  "modified": 1412047948.579031,
  "with": {
    "email": "[email protected]",
    "email_normalized": "[email protected]",
    "iden": "ujlMns72k",
    "image_url": "https://dl.pushbulletusercontent.com/foGfub1jtC6yYcOMACk1AbHwTrTKvrDc/john.jpg",
    "name": "John Carmack",
    "type": "user"
  }
}

update-chat

Update existing chat object.
Call
POST https://api.pushbullet.com/v2/chats/{iden}
Request
FieldTypeDescription
mutedbooltrue to mute the grant, false to unmute it
Example: true
Response
Chat object
Example
Request
curl --header 'Access-Token: <your_access_token_here>' \
     --header 'Content-Type: application/json' \
     --data-binary '{"muted":true}' \
     --request POST \
     https://api.pushbullet.com/v2/chats/ujpah72o0sjAoRtnM0jc
Response
{
  "active": true,
  "created": 1412047948.579029,
  "iden": "ujpah72o0sjAoRtnM0jc",
  "modified": 1412094382.919271,
  "muted": true,
  "with": {
    "email": "[email protected]",
    "email_normalized": "[email protected]",
    "iden": "ujlMns72k",
    "image_url": "https://dl.pushbulletusercontent.com/foGfub1jtC6yYcOMACk1AbHwTrTKvrDc/john.jpg",
    "name": "John Carmack",
    "type": "user"
  }
}

delete-chat

Delete a chat object.
Call
DELETE https://api.pushbullet.com/v2/chats/{iden}
Request
none
Response
none
Example
Request
curl --header 'Access-Token: <your_access_token_here>' \
     --request DELETE \
     https://api.pushbullet.com/v2/chats/ujpah72o0sjAoRtnM0jc
Response
{}

Device

FieldTypeDescription
idenstringUnique identifier for this object
Example: "ujpah72o0sjAoRtnM0jc"
activeboolfalse if the item has been deleted
Example: true
createdfloatCreation time in floating point seconds (unix timestamp)
Example: 1381092887.398433
modifiedfloatLast modified time in floating point seconds (unix timestamp)
Example: 1441054560.741007
iconstringIcon to use for this device, can be an arbitrary string. Commonly used values are: "desktop", "browser", "website", "laptop", "tablet", "phone", "watch", "system"
Example: "ios"
nicknamestringName to use when displaying the device
Example: "Elon Musk's iPhone"
generated_nicknamebooltrue if the nickname was automatically generated from the manufacturer and model fields (only used for some android phones)
Example: true
manufacturerstringManufacturer of the device
Example: "Apple"
modelstringModel of the device
Example: "iPhone 5s (GSM)"
app_versionintVersion of the Pushbullet application installed on the device
Example: 8623
fingerprintstringString fingerprint for the device, used by apps to avoid duplicate devices. Value is platform-specific.
Example: "nLN19IRNzS5xidPF+X8mKGNRpQo2X6XBgyO30FL6OiQ="
key_fingerprintstringFingerprint for the device's end-to-end encryption key, used to determine which devices the current device (based on its own key fingerprint) will be able to talk to.
Example: "5ae6ec7e1fe681861b0cc85c53accc13bf94c11db7461a2808903f7469bfda56"
push_tokenstringPlatform-specific push token. If you are making your own device, leave this blank and you can listen for events on the Realtime Event Stream.
Example: "production:f73be0ee7877c8c7fa69b1468cde764f"
has_smsstringtrue if the devices has SMS capability, currently only true for type="android" devices
Example: true
typestringDEPRECATED, use icon field instead. Type of device, can be an arbitrary string. Commonly used values are: "android", "chrome", "firefox", "ios", "windows", "stream", "safari", "mac", "opera", "website"
kindstringDEPRECATED, old name for type
pushableboolDEPRECATED, used to be for partially-initialized type="android" devices
Example
{
  "active": true,
  "app_version": 8623,
  "created": 1412047948.579029,
  "iden": "ujpah72o0sjAoRtnM0jc",
  "manufacturer": "Apple",
  "model": "iPhone 5s (GSM)",
  "modified": 1412047948.579031,
  "nickname": "Elon Musk's iPhone",
  "push_token": "production:f73be0ee7877c8c7fa69b1468cde764f"
}

list-devices

Get a list of devices belonging to the current user. If you have a large number of devices, you will need to use Pagination.
Call
GET https://api.pushbullet.com/v2/devices
Request
none
Response
FieldTypeDescription
devices[]DeviceArray of Device objects ordered with most recently modified first
Example
Request
curl --header 'Access-Token: <your_access_token_here>' \
     https://api.pushbullet.com/v2/devices
Response
{
  "devices": [
    {
      "active": true,
      "app_version": 8623,
      "created": 1412047948.579029,
      "iden": "ujpah72o0sjAoRtnM0jc",
      "manufacturer": "Apple",
      "model": "iPhone 5s (GSM)",
      "modified": 1412047948.579031,
      "nickname": "Elon Musk's iPhone",
      "push_token": "production:f73be0ee7877c8c7fa69b1468cde764f"
    }
  ]
}

create-device

Create a new device.
Call
POST https://api.pushbullet.com/v2/devices
Request
FieldTypeDescription
nicknamestringName to use when displaying the device
Example: "Elon Musk's iPhone"
modelstringModel of the device
Example: "iPhone 5s (GSM)"
manufacturerstringManufacturer of the device
Example: "Apple"
push_tokenstringPlatform-specific push token. If you are making your own device, leave this blank and you can listen for events on the Realtime Event Stream.
Example: "production:f73be0ee7877c8c7fa69b1468cde764f"
app_versionintVersion of the Pushbullet application installed on the device
Example: 8623
iconstringIcon to use for this device, can be an arbitrary string. Commonly used values are: "desktop", "browser", "website", "laptop", "tablet", "phone", "watch", "system"
Example: "ios"
has_smsstringtrue if the devices has SMS capability, currently only true for type="android" devices
Example: true
Response
Device object
Example
Request
curl --header 'Access-Token: <your_access_token_here>' \
     --header 'Content-Type: application/json' \
     --data-binary '{"app_version":8623,"manufacturer":"Apple","model":"iPhone 5s (GSM)","nickname":"Elon Musk's iPhone","push_token":"production:f73be0ee7877c8c7fa69b1468cde764f"}' \
     --request POST \
     https://api.pushbullet.com/v2/devices
Response
{
  "active": true,
  "app_version": 8623,
  "created": 1412047948.579029,
  "iden": "ujpah72o0sjAoRtnM0jc",
  "manufacturer": "Apple",
  "model": "iPhone 5s (GSM)",
  "modified": 1412047948.579031,
  "nickname": "Elon Musk's iPhone",
  "push_token": "production:f73be0ee7877c8c7fa69b1468cde764f"
}

update-device

Update an existing device.
Call
POST https://api.pushbullet.com/v2/devices/{iden}
Request
FieldTypeDescription
nicknamestringName to use when displaying the device
Example: "Elon Musk's iPhone"
modelstringModel of the device
Example: "iPhone 5s (GSM)"
manufacturerstringManufacturer of the device
Example: "Apple"
push_tokenstringPlatform-specific push token. If you are making your own device, leave this blank and you can listen for events on the Realtime Event Stream.
Example: "production:f73be0ee7877c8c7fa69b1468cde764f"
app_versionintVersion of the Pushbullet application installed on the device
Example: 8623
iconstringIcon to use for this device, can be an arbitrary string. Commonly used values are: "desktop", "browser", "website", "laptop", "tablet", "phone", "watch", "system"
Example: "ios"
has_smsstringtrue if the devices has SMS capability, currently only true for type="android" devices
Example: true
Response
Device object
Example
Request
curl --header 'Access-Token: <your_access_token_here>' \
     --header 'Content-Type: application/json' \
     --data-binary '{"nickname":"Work Phone"}' \
     --request POST \
     https://api.pushbullet.com/v2/devices/ujpah72o0sjAoRtnM0jc
Response
{
  "active": true,
  "app_version": 8623,
  "created": 1412047948.579029,
  "iden": "ujpah72o0sjAoRtnM0jc",
  "manufacturer": "Apple",
  "model": "iPhone 5s (GSM)",
  "modified": 1412094382.919271,
  "nickname": "Work Phone",
  "push_token": "production:f73be0ee7877c8c7fa69b1468cde764f"
}

delete-device

Delete a device.
Call
DELETE https://api.pushbullet.com/v2/devices
Request
none
Response
none
Example
Request
curl --header 'Access-Token: <your_access_token_here>' \
     --request DELETE \
     https://api.pushbullet.com/v2/devices/ujpah72o0sjAoRtnM0jc
Response
{}

Push

A Push.
FieldTypeDescription
idenstringUnique identifier for this object
Example: "ujpah72o0sjAoRtnM0jc"
activeboolfalse if the item has been deleted
Example: true
createdfloatCreation time in floating point seconds (unix timestamp)
Example: 1381092887.398433
modifiedfloatLast modified time in floating point seconds (unix timestamp)
Example: 1441054560.741007
typestringType of the push, one of "note", "file", "link".
Example: "note"
dismissedbooltrue if the push has been dismissed by any device or if any device was active when the push was received
Example: false
guidstringUnique identifier set by the client, used to identify a push in case you receive it from /v2/everything before the call to /v2/pushes has completed. This should be a unique value. Pushes with guid set are mostly idempotent, meaning that sending another push with the same guid is unlikely to create another push (it will return the previously created push).
Example: "993aaa48567d91068e96c75a74644159"
directionstringDirection the push was sent in, can be "self", "outgoing", or "incoming"
Example: "self"
sender_idenstringUser iden of the sender
Example: "ujpah72o0"
sender_emailstringEmail address of the sender
Example: "[email protected]"
sender_email_normalizedstringCanonical email address of the sender
Example: "[email protected]"
sender_namestringName of the sender
Example: "Elon Musk"
receiver_idenstringUser iden of the receiver
Example: "ujpah72o0"
receiver_emailstringEmail address of the receiver
Example: "[email protected]"
receiver_email_normalizedstringCanonical email address of the receiver
Example: "[email protected]"
target_device_idenstringDevice iden of the target device, if sending to a single device
Example: "ujpah72o0sjAoRtnM0jc"
source_device_idenstringDevice iden of the sending device. Optionally set by the sender when creating a push
Example: "ujpah72o0sjAoRtnM0jc"
client_idenstringIf the push was created by a client, set to the iden of that client.
Example: "ujpah72o0sjAoRtnM0jc"
channel_idenstringIf the push was created by a channel, set to the iden of that channel
Example: "ujpah72o0sjAoRtnM0jc"
awake_app_guids[]stringList of guids (client side identifiers, not the guid field on pushes) for awake apps at the time the push was sent. If the length of this list is > 0, dismissed will be set to true and the awake app(s) must decide what to do with the notification
Example: ["web-2d8cdf2a2b9b","web-cdb2313c74e"]
titlestringTitle of the push, used for all types of pushes
Example: "Space Travel Ideas"
bodystringBody of the push, used for all types of pushes
Example: "Space Elevator, Mars Hyperloop, Space Model S (Model Space?)"
urlstringURL field, used for type="link" pushes
Example: "http://www.teslamotors.com/"
file_namestringFile name, used for type="file" pushes
Example: "john.jpg"
file_typestringFile mime type, used for type="file" pushes
Example: "image/jpeg"
file_urlstringFile download url, used for type="file" pushes
Example: "https://dl.pushbulletusercontent.com/foGfub1jtC6yYcOMACk1AbHwTrTKvrDc/john.jpg"
image_urlstringURL to an image to use for this push, present on type="file" pushes if file_type matches image/*
Example: "https://lh3.googleusercontent.com/mrrz35lLbiYAz8ejkJcpdsYhN3tMEtrXxj93k_gQPin4GfdDjVy2Bj26pOGrpFQmAM7OFBHcDfdMjrScg3EUIJrgJeY"
image_widthintWidth of image in pixels, only present if image_url is set
Example: 322
image_heightintHeight of image in pixels, only present if image_url is set
Example: 484
Example
{
  "active": true,
  "body": "Space Elevator, Mars Hyperloop, Space Model S (Model Space?)",
  "created": 1412047948.579029,
  "direction": "self",
  "dismissed": false,
  "iden": "ujpah72o0sjAoRtnM0jc",
  "modified": 1412047948.579031,
  "receiver_email": "[email protected]",
  "receiver_email_normalized": "[email protected]",
  "receiver_iden": "ujpah72o0",
  "sender_email": "[email protected]",
  "sender_email_normalized": "[email protected]",
  "sender_iden": "ujpah72o0",
  "sender_name": "Elon Musk",
  "title": "Space Travel Ideas",
  "type": "note"
}

list-pushes

Request push history.
Call
GET https://api.pushbullet.com/v2/pushes
Request
FieldTypeDescription
modified_afterstringRequest pushes modified after this timestamp
Example: 1400000000
activestringDon't return deleted pushes
Example: true
cursorstringCursor for getting multiple pages of pushes, see Pagination
Example: "3eae6fa796b06b51b7bd6ad824b9b63b"
limitintegerLimit on the number of results returned, see Pagination
Example: 10
Response
FieldTypeDescription
pushes[]PushArray of Push objects ordered with most recently modified first
Example
Request
curl --header 'Access-Token: <your_access_token_here>' \
     --data-urlencode active="true" \
     --data-urlencode modified_after="1.4e+09" \
     --get \
     https://api.pushbullet.com/v2/pushes
Response
{
  "pushes": [
    {
      "active": true,
      "body": "Space Elevator, Mars Hyperloop, Space Model S (Model Space?)",
      "created": 1412047948.579029,
      "direction": "self",
      "dismissed": false,
      "iden": "ujpah72o0sjAoRtnM0jc",
      "modified": 1412047948.579031,
      "receiver_email": "[email protected]",
      "receiver_email_normalized": "[email protected]",
      "receiver_iden": "ujpah72o0",
      "sender_email": "[email protected]",
      "sender_email_normalized": "[email protected]",
      "sender_iden": "ujpah72o0",
      "sender_name": "Elon Musk",
      "title": "Space Travel Ideas",
      "type": "note"
    }
  ]
}

create-push

Send a push to a device or another person.

Target Parameters

Each push has a target, if you don't specify a target, we will broadcast it to all of the user's devices. Only one target may be specified.

Parameters for different types of pushes

Push a file

Pushing files is a two-part process: first the file needs to be uploaded, then a push needs to be sent for that file.
To upload a new file, use upload-request.
Once the file has been uploaded, set the file_name, file_url, and file_type returned in the response to the upload request as the parameters for a new push with type="file".
Call
POST https://api.pushbullet.com/v2/pushes
Request
FieldTypeDescription
typestringType of the push, one of "note", "file", "link".
Example: "note"
titlestringTitle of the push, used for all types of pushes
Example: "Space Travel Ideas"
bodystringBody of the push, used for all types of pushes
Example: "Space Elevator, Mars Hyperloop, Space Model S (Model Space?)"
urlstringURL field, used for type="link" pushes
Example: "http://www.teslamotors.com/"
file_namestringFile name, used for type="file" pushes
Example: "john.jpg"
file_typestringFile mime type, used for type="file" pushes
Example: "image/jpeg"
file_urlstringFile download url, used for type="file" pushes
Example: "https://dl.pushbulletusercontent.com/foGfub1jtC6yYcOMACk1AbHwTrTKvrDc/john.jpg"
source_device_idenstringDevice iden of the sending device. Optional.
Example: "ujpah72o0sjAoRtnM0jc"
device_idenstringDevice iden of the target device, if sending to a single device. Appears as target_device_iden on the push.
Example: "ujpah72o0sjAoRtnM0jc"
client_idenstringClient iden of the target client, sends a push to all users who have granted access to this client. The current user must own this client.
Example: "ujpah72o0sjAoRtnM0jc"
channel_tagstringChannel tag of the target channel, sends a push to all people who are subscribed to this channel. The current user must own this channel.
emailstringEmail address to send the push to. If there is a pushbullet user with this address, they get a push, otherwise they get an email.
guidstringUnique identifier set by the client, used to identify a push in case you receive it from /v2/everything before the call to /v2/pushes has completed. This should be a unique value. Pushes with guid set are mostly idempotent, meaning that sending another push with the same guid is unlikely to create another push (it will return the previously created push).
Example: "993aaa48567d91068e96c75a74644159"
Response
Push object
Example
Request
curl --header 'Access-Token: <your_access_token_here>' \
     --header 'Content-Type: application/json' \
     --data-binary '{"body":"Space Elevator, Mars Hyperloop, Space Model S (Model Space?)","title":"Space Travel Ideas","type":"note"}' \
     --request POST \
     https://api.pushbullet.com/v2/pushes
Response
{
  "active": true,
  "body": "Space Elevator, Mars Hyperloop, Space Model S (Model Space?)",
  "created": 1412047948.579029,
  "direction": "self",
  "dismissed": false,
  "iden": "ujpah72o0sjAoRtnM0jc",
  "modified": 1412047948.579031,
  "receiver_email": "[email protected]",
  "receiver_email_normalized": "[email protected]",
  "receiver_iden": "ujpah72o0",
  "sender_email": "[email protected]",
  "sender_email_normalized": "[email protected]",
  "sender_iden": "ujpah72o0",
  "sender_name": "Elon Musk",
  "title": "Space Travel Ideas",
  "type": "note"
}

update-push

Update a push.
Call
POST https://api.pushbullet.com/v2/pushes/{iden}
Request
FieldTypeDescription
dismissedboolMarks a push as having been dismissed by the user, will cause any notifications for the push to be hidden if possible.
Example: true
Response
Push object
Example
Request
curl --header 'Access-Token: <your_access_token_here>' \
     --header 'Content-Type: application/json' \
     --data-binary '{"dismissed":true}' \
     --request POST \
     https://api.pushbullet.com/v2/pushes/ujpah72o0sjAoRtnM0jc
Response
{
  "active": true,
  "body": "Space Elevator, Mars Hyperloop, Space Model S (Model Space?)",
  "created": 1412047948.579029,
  "direction": "self",
  "dismissed": true,
  "iden": "ujpah72o0sjAoRtnM0jc",
  "modified": 1412094382.919271,
  "receiver_email": "[email protected]",
  "receiver_email_normalized": "[email protected]",
  "receiver_iden": "ujpah72o0",
  "sender_email": "[email protected]",
  "sender_email_normalized": "[email protected]",
  "sender_iden": "ujpah72o0",
  "sender_name": "Elon Musk",
  "title": "Space Travel Ideas",
  "type": "note"
}

delete-push

Delete a push.
Call
DELETE https://api.pushbullet.com/v2/pushes/{iden}
Request
none
Response
none
Example
Request
curl --header 'Access-Token: <your_access_token_here>' \
     --request DELETE \
     https://api.pushbullet.com/v2/pushes/ujpah72o0sjAoRtnM0jc
Response
{}

delete-all-pushes

Delete all pushes belonging to the current user. This call is asynchronous, the pushes will be deleted after the call returns.
Call
DELETE https://api.pushbullet.com/v2/pushes
Request
none
Response
none
Example
Request
curl --header 'Access-Token: <your_access_token_here>' \
     --request DELETE \
     https://api.pushbullet.com/v2/pushes
Response
{}

Channel

FieldTypeDescription
idenstringUnique identifier for this object
Example: "ujpah72o0sjAoRtnM0jc"
activeboolfalse if the item has been deleted
Example: true
createdfloatCreation time in floating point seconds (unix timestamp)
Example: 1381092887.398433
modifiedfloatLast modified time in floating point seconds (unix timestamp)
Example: 1441054560.741007
tagstringGlobally unique identifier for this channel, chosen by the channel creator
Example: "elonmusknews"
namestringName of the channel
Example: "Elon Musk News"
descriptionstringDescription of the channel
Example: "News about Elon Musk"
image_urlstringImage to display for the channel
Example: "https://dl.pushbulletusercontent.com/StzRmwdkIe8gluBH3XoJ9HjRqjlUYSf4/musk.jpg"
website_urlstringWebsite for the channel
Example: "https://twitter.com/elonmusk"
feed_urlstringURL for RSS feed. If this is set, the RSS feed will be used to automatically create posts for this channel
Example: "http://blog.humblebundle.com/rss"
feed_filters[]objectFilters to use when a feed_url is set, only posts matching these filters will be sent out on the channel.
 ↳ fieldstringField to match filter against, only "title" is currently supported
Example: "title"
 ↳ operatorstringOperation for filter to match value against the chosen field, only "contains" is currently supported
Example: "contains"
 ↳ valuestringValue to compare to the field using the chosen operator
Example: "humble indie bundle"
 ↳ notboolInvert the result of this filter
Example: false
 ↳ ignore_caseboolIf true, match without regards to lowercase/uppercase
Example: true
Example
{
  "active": true,
  "created": 1412047948.579029,
  "description": "News about Elon Musk",
  "iden": "ujpah72o0sjAoRtnM0jc",
  "image_url": "https://dl.pushbulletusercontent.com/StzRmwdkIe8gluBH3XoJ9HjRqjlUYSf4/musk.jpg",
  "modified": 1412047948.579031,
  "name": "Elon Musk News",
  "tag": "elonmusknews",
  "website_url": "https://twitter.com/elonmusk"
}

create-channel

Create a channel.
Call
POST https://api.pushbullet.com/v2/channels
Request
FieldTypeDescription
tagstringGlobally unique identifier for this channel, chosen by the channel creator
Example: "elonmusknews"
namestringName of the channel
Example: "Elon Musk News"
descriptionstringDescription of the channel
Example: "News about Elon Musk"
image_urlstringImage to display for the channel
Example: "https://dl.pushbulletusercontent.com/StzRmwdkIe8gluBH3XoJ9HjRqjlUYSf4/musk.jpg"
website_urlstringWebsite for the channel
Example: "https://twitter.com/elonmusk"
feed_urlstringURL for RSS feed. If this is set, the RSS feed will be used to automatically create posts for this channel
Example: "http://blog.humblebundle.com/rss"
feed_filters[]objectFilters to use when a feed_url is set, only posts matching these filters will be sent out on the channel.
 ↳ fieldstringField to match filter against, only "title" is currently supported
Example: "title"
 ↳ operatorstringOperation for filter to match value against the chosen field, only "contains" is currently supported
Example: "contains"
 ↳ valuestringValue to compare to the field using the chosen operator
Example: "humble indie bundle"
 ↳ notboolInvert the result of this filter
Example: false
 ↳ ignore_caseboolIf true, match without regards to lowercase/uppercase
Example: true
subscribeboolIf this is set to true, a subscription will be created as soon as the channel is created.
Example: true
Response
Channel object
Example
Request
curl --header 'Access-Token: <your_access_token_here>' \
     --header 'Content-Type: application/json' \
     --data-binary '{"description":"News about Elon Musk","image_url":"https://dl.pushbulletusercontent.com/StzRmwdkIe8gluBH3XoJ9HjRqjlUYSf4/musk.jpg","name":"Elon Musk News","tag":"elonmusknews","website_url":"https://twitter.com/elonmusk"}' \
     --request POST \
     https://api.pushbullet.com/v2/channels
Response
{
  "active": true,
  "created": 1412047948.579029,
  "description": "News about Elon Musk.",
  "iden": "ujxPklLhvyKsjAvkMyTVh6",
  "image_url": "https://dl.pushbulletusercontent.com/StzRmwdkIe8gluBH3XoJ9HjRqjlUYSf4/musk.jpg",
  "modified": 1412047948.579031,
  "name": "Elon Musk News",
  "tag": "elonmusknews"
}

Subscription

Subscribe to channels to receive any updates pushed to that channel.
Channels can be created on the website. Each channel has a unique tag to identify it. When you push to a channel, all people subscribed to that channel will receive a push.
To push to a channel, use the channel_tag parameter on create-push
FieldTypeDescription
idenstringUnique identifier for this object
Example: "ujpah72o0sjAoRtnM0jc"
activeboolfalse if the item has been deleted
Example: true
createdfloatCreation time in floating point seconds (unix timestamp)
Example: 1381092887.398433
modifiedfloatLast modified time in floating point seconds (unix timestamp)
Example: 1441054560.741007
mutedboolIf true, notifications from this subscription will not be shown
Example: false
channelobjectInformation about the channel that is being subscribed to
 ↳ idenstringUnique identifier for the channel
Example: "ujpah72o0sjAoRtnM0jc"
 ↳ tagstringUnique tag for this channel
Example: "elonmusknews"
 ↳ namestringName of the channel
Example: "Elon Musk News"
 ↳ descriptionstringDescription of the channel
Example: "News about Elon Musk."
 ↳ image_urlstringImage for the channel
Example: "https://dl.pushbulletusercontent.com/StzRmwdkIe8gluBH3XoJ9HjRqjlUYSf4/musk.jpg"
 ↳ website_urlstringLink to a website for the channel
Example: "https://twitter.com/elonmusk"
Example
{
  "active": true,
  "channel": {
    "description": "News about Elon Musk.",
    "iden": "ujxPklLhvyKsjAvkMyTVh6",
    "image_url": "https://dl.pushbulletusercontent.com/StzRmwdkIe8gluBH3XoJ9HjRqjlUYSf4/musk.jpg",
    "name": "Elon Musk News",
    "tag": "elonmusknews"
  },
  "created": 1412047948.579029,
  "iden": "ujpah72o0sjAoRtnM0jc",
  "modified": 1412047948.579031,
  "muted": false
}

list-subscriptions

Get a list of subscriptions belonging to the current user. If you have a large number of subscriptions, you will need to use Pagination.
Call
GET https://api.pushbullet.com/v2/subscriptions
Request
none
Response
FieldTypeDescription
subscriptions[]SubscriptionArray of Subscription objects ordered with most recently modified first
Example
Request
curl --header 'Access-Token: <your_access_token_here>' \
     https://api.pushbullet.com/v2/subscriptions
Response
{
  "subscriptions": [
    {
      "active": true,
      "channel": {
        "description": "News about Elon Musk.",
        "iden": "ujxPklLhvyKsjAvkMyTVh6",
        "image_url": "https://dl.pushbulletusercontent.com/StzRmwdkIe8gluBH3XoJ9HjRqjlUYSf4/musk.jpg",
        "name": "Elon Musk News",
        "tag": "elonmusknews"
      },
      "created": 1412047948.579029,
      "iden": "ujpah72o0sjAoRtnM0jc",
      "modified": 1412047948.579031
    }
  ]
}

create-subscription

Call
POST https://api.pushbullet.com/v2/subscriptions
Request
FieldTypeDescription
channel_tagstringUnique tag for the channel to subscribe to
Example: "elonmusknews"
Response
Subscription object
Example
Request
curl --header 'Access-Token: <your_access_token_here>' \
     --header 'Content-Type: application/json' \
     --data-binary '{"channel_tag":"elonmusknews"}' \
     --request POST \
     https://api.pushbullet.com/v2/subscriptions
Response
{
  "active": true,
  "channel": {
    "description": "News about Elon Musk.",
    "iden": "ujxPklLhvyKsjAvkMyTVh6",
    "image_url": "https://dl.pushbulletusercontent.com/StzRmwdkIe8gluBH3XoJ9HjRqjlUYSf4/musk.jpg",
    "name": "Elon Musk News",
    "tag": "elonmusknews"
  },
  "created": 1412047948.579029,
  "iden": "ujpah72o0sjAoRtnM0jc",
  "modified": 1412047948.579031
}

update-subscription

Call
POST https://api.pushbullet.com/v2/subscriptions/{iden}
Request
FieldTypeDescription
mutedbooltrue to mute the subscription, false to unmute it
Example: true
Response
Subscription object
Example
Request
curl --header 'Access-Token: <your_access_token_here>' \
     --header 'Content-Type: application/json' \
     --data-binary '{"muted":true}' \
     --request POST \
     https://api.pushbullet.com/v2/subscriptions/ujpah72o0sjAoRtnM0jc
Response
{
  "active": true,
  "channel": {
    "description": "News about Elon Musk.",
    "iden": "ujxPklLhvyKsjAvkMyTVh6",
    "image_url": "https://dl.pushbulletusercontent.com/StzRmwdkIe8gluBH3XoJ9HjRqjlUYSf4/musk.jpg",
    "name": "Elon Musk News",
    "tag": "elonmusknews"
  },
  "created": 1412047948.579029,
  "iden": "ujpah72o0sjAoRtnM0jc",
  "modified": 1412094382.919271,
  "muted": true
}

delete-subscription

Unsubscribe from a channel.
Call
DELETE https://api.pushbullet.com/v2/subscriptions/{iden}
Request
none
Response
Subscription object
Example
Request
curl --header 'Access-Token: <your_access_token_here>' \
     --request DELETE \
     https://api.pushbullet.com/v2/subscriptions/ujpah72o0sjAoRtnM0jc
Response
{}

channel-info

Get information about a channel.
Call
GET https://api.pushbullet.com/v2/channel-info
Request
FieldTypeDescription
tagstringTag of the channel to get information for
Example: "elonmusknews"
no_recent_pushesboolDon't show recent pushes, defaults to false
Example: true
Response
FieldTypeDescription
idenstringUnique identifier for the channel
Example: "ujpah72o0sjAoRtnM0jc"
namestringName of the channel
Example: "Elon Musk News"
descriptionstringDescription of the channel
Example: "News about Elon Musk"
image_urlstringImage to display for the channel
Example: "https://dl.pushbulletusercontent.com/StzRmwdkIe8gluBH3XoJ9HjRqjlUYSf4/musk.jpg"
subscriber_countintNumber of subscribers to the channel
Example: 9382239
tagstringGlobally unique identifier for the channel, chosen by the channel creator
Example: "elonmusknews"
recent_pushes[]PushArray of recent Push objects sent on the channel
Example
Request
curl --data-urlencode no_recent_pushes="true" \
     --data-urlencode tag="elonmusknews" \
     --get \
     https://api.pushbullet.com/v2/channel-info
Response
{
  "active": true,
  "created": 1412047948.579029,
  "description": "News about Elon Musk.",
  "iden": "ujxPklLhvyKsjAvkMyTVh6",
  "image_url": "https://dl.pushbulletusercontent.com/StzRmwdkIe8gluBH3XoJ9HjRqjlUYSf4/musk.jpg",
  "modified": 1412047948.579031,
  "name": "Elon Musk News",
  "subscriber_count": 9382239,
  "tag": "elonmusknews"
}

Text

Send text messages (SMS) to one phone number or group messages (MMS) to mulitple phone numbers. Also supports sending picture messages.
Text messages are queued and sent as soon as possible. If the sending device does not come online and sync within 1 hour, the message is canceled and will not send.
Users and developers are advised to ensure Pushbullet is able to reliably run in the background. Follow the "Solutions for Users" section based on your phone manufacturer on this page: https://dontkillmyapp.com/
For more information about this API, read our blog post.
To send a text message, use create-text
FieldTypeDescription
idenstringUnique identifier for this object
Example: "ujpah72o0sjAoRtnM0jc"
activeboolfalse if the item has been deleted
Example: true
createdfloatCreation time in floating point seconds (unix timestamp)
Example: 1381092887.398433
modifiedfloatLast modified time in floating point seconds (unix timestamp)
Example: 1441054560.741007
dataobjectMap of values specifying this text message
Example: {"addresses":["+13035551212"],"guid":"993aaa48567d91068e96c75a74644159","message":"Text message body.","status":"queued","target_device_iden":"ujpah72o0sjAoRtnM0jc"}
file_urlstringFile download url for an image to send with the text message
Example: "https://dl.pushbulletusercontent.com/foGfub1jtC6yYcOMACk1AbHwTrTKvrDc/john.jpg"
skip_delete_fileboolIf set to false, delete the attached file when the Text is deleted.
Example: true

create-text

Create a new text. The text will automatically be deleted after an hour whether it has been sent or not.
  • data - map of values specifying this text message
    • target_device_iden - The device_iden of the Device to send the message. This device must have SMS Android permissions granted.
    • addresses - A list of 1 more phone numbers to send this message to. Including than one number sends a group MMS message.
    • message - The text content of the text message.
    • guid - Unique identifier optionally set by the client, used to identify a text message to ensure it is not sent multiple times in the case create-text is called for it more than once.
    • status - The state of this message. One of "queued" / absent, "sent" or "failed".
    • file_type - The mime type of the file_url being sent with this message. Only required for messages sending a file.
Call
POST https://api.pushbullet.com/v2/texts
Request
FieldTypeDescription
dataobjectMap of values specifying this text message. See here for full specification
Example: {"addresses":["+13035551212"],"file_type":"image/jpeg","guid":"993aaa48567d91068e96c75a74644159","message":"Text message body.","target_device_iden":"ujpah72o0sjAoRtnM0jc"}
file_urlstringFile download url for an image to send with the text message. Docs for how to upload files here here.
Example: "https://dl.pushbulletusercontent.com/foGfub1jtC6yYcOMACk1AbHwTrTKvrDc/john.jpg"
skip_delete_fileboolIf set to false, delete the attached file when the Text is deleted.
Example: true
Response
FieldTypeDescription
idenstringIden of the created text
Example: "ujpah72o0sjAoRtnM0jc"
Example
Request
curl --header 'Access-Token: <your_access_token_here>' \
     --header 'Content-Type: application/json' \
     --data-binary '{"data":{"addresses":["+13035551212"],"file_type":"image/jpeg","guid":"993aaa48567d91068e96c75a74644159","message":"Text message body.","target_device_iden":"ujpah72o0sjAoRtnM0jc"},"file_url":"https://dl.pushbulletusercontent.com/foGfub1jtC6yYcOMACk1AbHwTrTKvrDc/john.jpg"}' \
     --request POST \
     https://api.pushbullet.com/v2/texts
Response
{
  "active": true,
  "created": 1412047948.579029,
  "data": {
    "addresses": [
      "+13035551212"
    ],
    "file_type": "image/jpeg",
    "guid": "993aaa48567d91068e96c75a74644159",
    "message": "Text message body.",
    "target_device_iden": "ujpah72o0sjAoRtnM0jc"
  },
  "file_url": "https://dl.pushbulletusercontent.com/foGfub1jtC6yYcOMACk1AbHwTrTKvrDc/john.jpg",
  "iden": "ujpah72o0sjAoRtnM0jc",
  "modified": 1412047948.579031
}

update-text

Update a text. If the text has already been sent this will not affect the message.
Call
POST https://api.pushbullet.com/v2/texts/{iden}
Request
FieldTypeDescription
idenstringIden of the text to delete
Example: "ujpah72o0sjAoRtnM0jc"
dataobjectMap of values specifying this text message. See here for full specification
Example: {"addresses":["+13035551212"],"file_type":"image/jpeg","guid":"993aaa48567d91068e96c75a74644159","message":"Text message body.","target_device_iden":"ujpah72o0sjAoRtnM0jc"}
skip_delete_fileboolWhen the text is deleted, don't delete the attached file. The file being deleted or not does not affect the MMS that was sent. Can only be set to true
Example: true
Response
none
Example
Request
curl --header 'Access-Token: <your_access_token_here>' \
     --header 'Content-Type: application/json' \
     --data-binary '{"data":{"addresses":["+13035551212"],"file_type":"image/jpeg","guid":"993aaa48567d91068e96c75a74644159","message":"Updated message body.","target_device_iden":"ujpah72o0sjAoRtnM0jc"},"iden":"ujpah72o0sjAoRtnM0jc","skip_delete_file":true}' \
     --request POST \
     https://api.pushbullet.com/v2/texts/{iden}
Response
{
  "active": true,
  "created": 1412047948.579029,
  "data": {
    "addresses": [
      "+13035551212"
    ],
    "file_type": "image/jpeg",
    "guid": "993aaa48567d91068e96c75a74644159",
    "message": "Updated message body.",
    "target_device_iden": "ujpah72o0sjAoRtnM0jc"
  },
  "file_url": "https://dl.pushbulletusercontent.com/foGfub1jtC6yYcOMACk1AbHwTrTKvrDc/john.jpg",
  "iden": "ujpah72o0sjAoRtnM0jc",
  "modified": 1412047948.579031
}

delete-text

Delete a text, canceling it if it has not already been sent. If there is an attached file and skip_delete_file has not been set, the file will be deleted.
Call
POST https://api.pushbullet.com/v2/texts/{iden}
Request
FieldTypeDescription
idenstringIden of the text to delete
Example: "ujpah72o0sjAoRtnM0jc"
Response
none
Example
Request
curl --header 'Access-Token: <your_access_token_here>' \
     --header 'Content-Type: application/json' \
     --data-binary '{"iden":"ujpah72o0sjAoRtnM0jc"}' \
     --request POST \
     https://api.pushbullet.com/v2/texts/{iden}
Response
{}

User

FieldTypeDescription
idenstringUnique identifier for the current user
Example: "ujpah72o0"
createdfloatCreation time in floating point seconds (unix timestamp)
Example: 1381092887.398433
modifiedfloatLast modified time in floating point seconds (unix timestamp)
Example: 1441054560.741007
emailstringEmail address
email_normalizedstringCanonical email address
namestringFull name if available
Example: "Elon Musk"
image_urlstringURL for image of user or placeholder image
Example: "https://static.pushbullet.com/missing-image/55a7dc-45"
max_upload_sizeintMaximum upload size in bytes
Example: 26214400
referred_countintNumber of users referred by this user
Example: 2
referrer_idenstringUser iden for the user that referred the current user, if set
Example: "ujlxm0aiz2"
Example
{
  "created": 1381092887.398433,
  "email": "[email protected]",
  "email_normalized": "[email protected]",
  "iden": "ujpah72o0",
  "image_url": "https://static.pushbullet.com/missing-image/55a7dc-45",
  "max_upload_size": 26214400,
  "modified": 1441054560.741007,
  "name": "Elon Musk"
}

get-user

Gets the currently logged in user.
Call
GET https://api.pushbullet.com/v2/users/me
Request
none
Response
User object
Example
Request
curl --header 'Access-Token: <your_access_token_here>' \
     https://api.pushbullet.com/v2/users/me
Response
{
  "created": 1381092887.398433,
  "email": "[email protected]",
  "email_normalized": "[email protected]",
  "iden": "ujpah72o0",
  "image_url": "https://static.pushbullet.com/missing-image/55a7dc-45",
  "max_upload_size": 26214400,
  "modified": 1441054560.741007,
  "name": "Elon Musk"
}

Upload

To upload a file you need to call upload-request with the file name and type. After you get an upload_url from the response, you can upload the file contents using multipart/form-data encoding.
EXAMPLE REQUEST
curl -i -X POST https://upload.pushbullet.com/upload-legacy/a5e1776d2566a6b16032958697288df4 \
  -F [email protected]
EXAMPLE RESPONSE
HTTP/1.1 204 No Content
After the request completes, the file will be available at the file_url from the upload-request response.

upload-request

Request authorization to upload a file.
Call
POST https://api.pushbullet.com/v2/upload-request
Request
FieldTypeDescription
file_namestringThe name of the file you want to upload
Example: "cat.jpg"
file_typestringThe MIME type of the file
Example: "image/jpeg"
Response
FieldTypeDescription
file_namestringThe file name that will be used for the file (may be truncated from the original file_name.
file_typestringThe file type that will be used for the file (may be different from the one provided to upload-request.
file_urlstringThe URL where the file will be available after it is uploaded.
upload_urlstringThe URL to POST the file to. The file must be posted using multipart/form-data encoding.
dataobjectDEPRECATED
Example
Request
curl --header 'Access-Token: <your_access_token_here>' \
     --header 'Content-Type: application/json' \
     --data-binary '{"file_name":"cat.jpg","file_type":"image/jpeg"}' \
     --request POST \
     https://api.pushbullet.com/v2/upload-request
Response
{
  "file_name": "cat.jpg",
  "file_type": "image/jpeg",
  "file_url": "https://dl.pushbulletusercontent.com/034f197bc6c37cac3cc03542659d458b/cat.jpg",
  "upload_url": "https://upload.pushbullet.com/upload-legacy/a5e1776d2566a6b16032958697288df4"
}

Changelog

• Added API call for creating Channels.

• Removed iPhone Extensions section.

• Added Text objects for reliable SMS sending.

• Removed address and list pushes which have been deprecated for forever.

• Fixed curl link for windows.

• Removed Android Extension section, as this has been replaced with Android Wear integration, the Android Extension is no longer needed.

• New style for docs.
• Removed Contacts calls as the official apps no longer user Contacts. These have been replaced with the Chat objects.

• Added a run button to execute javascript snippets.

• Added information on encryption in End-to-End Encryption.
• Added new auth header Access-Token to Requests, removed mention of older auth headers.
• Removed outdated information from Resizing Images.

• Added information about ratelimiting.

• Added Send SMS using ephemerals.
• Updated Resizing Images to mention new resizing method and remove old ones.