Prerequisites
- A Pushbullet account
- Your Pushbullet Access Token
Setup
1
Create a Pushbullet access token
In Pushbullet, open account settings and create an access token.
2
Configure in Courier
Open the in Courier, enter your access token, then click “Save.”
Profile requirements
Device tokens live on the user profile rather than on the send, so one profile can hold tokens for several devices and every push provider reads them from the same place. covers the model. Pushbullet needs no profile data.Overrides
covers the two levels and which one wins. lists the fields every push provider takes. Overrides change the request body Courier sends. You can override any field supported by Pushbullet’s/pushes endpoint (Pushbullet’s create push reference).
Body overrides
This example sends aurl by overriding the push type:
const { requestId } = await courier.send.message({
message: {
template: "nt_01kx4h2jdafq8bk9aftxak4b40",
to: {},
providers: {
pushbullet: {
override: {
body: {
type: "link",
url: "https://www.courier.com",
},
},
},
},
},
});
response = client.send.message(
message={
"template": "nt_01kx4h2jdafq8bk9aftxak4b40",
"to": {},
"providers": {
"pushbullet": {
"override": {
"body": {
"type": "link",
"url": "https://www.courier.com",
},
},
},
},
},
)
curl -X POST https://api.courier.com/send \
-H "Authorization: Bearer $COURIER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"message": {
"template": "nt_01kx4h2jdafq8bk9aftxak4b40",
"to": {},
"providers": {
"pushbullet": {
"override": {
"body": {
"type": "link",
"url": "https://www.courier.com"
}
}
}
}
}
}'
response = courier.send_.message(
message: {
template: "nt_01kx4h2jdafq8bk9aftxak4b40",
to: {},
providers: {
pushbullet: {
override: {
body: {
type: "link",
url: "https://www.courier.com"
}
}
}
}
}
)
response, err := client.Send.Message(context.TODO(), courier.SendMessageParams{
Message: courier.SendMessageParamsMessage{
To: courier.SendMessageParamsMessageToUnion{
OfUserRecipient: &shared.UserRecipientParam{
},
},
Template: courier.String("nt_01kx4h2jdafq8bk9aftxak4b40"),
Providers: shared.MessageProvidersParam{
"pushbullet": shared.MessageProvidersTypeParam{
Override: map[string]any{
"body": map[string]any{
"type": "link",
"url": "https://www.courier.com",
},
},
},
},
},
})
SendMessageParams params = SendMessageParams.builder()
.message(SendMessageParams.Message.builder()
.to(UserRecipient.builder().build())
.template("nt_01kx4h2jdafq8bk9aftxak4b40")
.providers(MessageProviders.builder()
.putAdditionalProperty("pushbullet", JsonValue.from(java.util.Map.of("override", java.util.Map.of(
"body", java.util.Map.of(
"type", "link",
"url", "https://www.courier.com"
)
))))
.build())
.build())
.build();
SendMessageResponse response = client.send().message(params);
$response = $client->send->message(
message: [
'template' => 'nt_01kx4h2jdafq8bk9aftxak4b40',
'to' => [],
'providers' => [
'pushbullet' => [
'override' => [
'body' => [
'type' => 'link',
'url' => 'https://www.courier.com',
],
],
],
],
],
);
SendMessageParams parameters = new()
{
Message = new()
{
To = new UserRecipient { },
Template = "nt_01kx4h2jdafq8bk9aftxak4b40",
Providers = new Dictionary<string, MessageProvidersType>()
{
{
"pushbullet",
new()
{
Override = JsonSerializer.Deserialize<Dictionary<string, JsonElement>>(
"""
{
"body": {
"type": "link",
"url": "https://www.courier.com"
}
}
"""
),
}
},
},
},
};
var response = await client.Send.Message(parameters);
courier send message \
--api-key "$COURIER_API_KEY" \
--message.to '{}' \
--message.template nt_01kx4h2jdafq8bk9aftxak4b40 \
--message.providers '{"pushbullet": {"override": {"body": {"type": "link", "url": "https://www.courier.com"}}}}'
With Courier MCP, send my template through Pushbullet as a link push.
Config overrides
Swap the access token at send time with a config override:const { requestId } = await courier.send.message({
message: {
template: "nt_01kx4h2jdafq8bk9aftxak4b40",
to: {},
providers: {
pushbullet: {
override: {
config: {
accessToken: "RUNTIME_ACCESS_TOKEN",
},
},
},
},
},
});
response = client.send.message(
message={
"template": "nt_01kx4h2jdafq8bk9aftxak4b40",
"to": {},
"providers": {
"pushbullet": {
"override": {
"config": {
"accessToken": "RUNTIME_ACCESS_TOKEN",
},
},
},
},
},
)
curl -X POST https://api.courier.com/send \
-H "Authorization: Bearer $COURIER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"message": {
"template": "nt_01kx4h2jdafq8bk9aftxak4b40",
"to": {},
"providers": {
"pushbullet": {
"override": {
"config": {
"accessToken": "RUNTIME_ACCESS_TOKEN"
}
}
}
}
}
}'
response = courier.send_.message(
message: {
template: "nt_01kx4h2jdafq8bk9aftxak4b40",
to: {},
providers: {
pushbullet: {
override: {
config: {
accessToken: "RUNTIME_ACCESS_TOKEN"
}
}
}
}
}
)
response, err := client.Send.Message(context.TODO(), courier.SendMessageParams{
Message: courier.SendMessageParamsMessage{
To: courier.SendMessageParamsMessageToUnion{
OfUserRecipient: &shared.UserRecipientParam{
},
},
Template: courier.String("nt_01kx4h2jdafq8bk9aftxak4b40"),
Providers: shared.MessageProvidersParam{
"pushbullet": shared.MessageProvidersTypeParam{
Override: map[string]any{
"config": map[string]any{
"accessToken": "RUNTIME_ACCESS_TOKEN",
},
},
},
},
},
})
SendMessageParams params = SendMessageParams.builder()
.message(SendMessageParams.Message.builder()
.to(UserRecipient.builder().build())
.template("nt_01kx4h2jdafq8bk9aftxak4b40")
.providers(MessageProviders.builder()
.putAdditionalProperty("pushbullet", JsonValue.from(java.util.Map.of("override", java.util.Map.of(
"config", java.util.Map.of(
"accessToken", "RUNTIME_ACCESS_TOKEN"
)
))))
.build())
.build())
.build();
SendMessageResponse response = client.send().message(params);
$response = $client->send->message(
message: [
'template' => 'nt_01kx4h2jdafq8bk9aftxak4b40',
'to' => [],
'providers' => [
'pushbullet' => [
'override' => [
'config' => [
'accessToken' => 'RUNTIME_ACCESS_TOKEN',
],
],
],
],
],
);
SendMessageParams parameters = new()
{
Message = new()
{
To = new UserRecipient { },
Template = "nt_01kx4h2jdafq8bk9aftxak4b40",
Providers = new Dictionary<string, MessageProvidersType>()
{
{
"pushbullet",
new()
{
Override = JsonSerializer.Deserialize<Dictionary<string, JsonElement>>(
"""
{
"config": {
"accessToken": "RUNTIME_ACCESS_TOKEN"
}
}
"""
),
}
},
},
},
};
var response = await client.Send.Message(parameters);
courier send message \
--api-key "$COURIER_API_KEY" \
--message.to '{}' \
--message.template nt_01kx4h2jdafq8bk9aftxak4b40 \
--message.providers '{"pushbullet": {"override": {"config": {"accessToken": "RUNTIME_ACCESS_TOKEN"}}}}'
With Courier MCP, send my template through Pushbullet with a different access token.
Provider details
pushbullet
routing.channels instead is supported, and sends through just this provider.
Send to a specific provider
When that is worth doing, and what you give up: failover, channel priority, and providers you add later.