API Documentation

API Endpoint

Pulses

Pulses

A Pulse is an automated report delivery service that makes it easy to stay updated without having to manually check your reports. You can set up Pulses for any of your reports, choosing how often you’d like to receive them — whether it’s daily, weekly, bi-weekly, or monthly. This way, important data arrives straight to your inbox or Slack, keeping you informed at your preferred schedule.

Email recipients are managed in two ways:

  • Memberships: link existing Productive users or teams to a pulse (done via the memberships endpoint).

  • recipients attribute: specify additional email addresses that are not linked to any user in the app.

More about Pulses in our help center

Supported filter params

  • filter_id (array)
GET /api/v2/pulses
Requestsreturns pulses

GET  /api/v2/pulses

Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+json
Responses200
Headers
Content-Type: application/vnd.api+json; charset=utf-8
Body
{
  "data": [
    {
      "id": "1",
      "type": "pulses",
      "attributes": {
        "deactivated_at": null,
        "document_format_id": 1,
        "export_params": {},
        "repeat_schedule_id": 1,
        "schedule_day_id": null,
        "schedule_frame_id": null,
        "schedule_hour": 9,
        "skip_if_empty": true,
        "slack_channel": null,
        "test_pulse": false,
        "type_id": 1,
        "recipients": []
      },
      "relationships": {
        "organization": {
          "data": {
            "type": "organizations",
            "id": "1033"
          }
        },
        "creator": {
          "meta": {
            "included": false
          }
        },
        "filter": {
          "meta": {
            "included": false
          }
        },
        "memberships": {
          "meta": {
            "included": false
          }
        }
      }
    },
    {
      "id": "2",
      "type": "pulses",
      "attributes": {
        "deactivated_at": null,
        "document_format_id": 1,
        "export_params": {},
        "repeat_schedule_id": 1,
        "schedule_day_id": null,
        "schedule_frame_id": null,
        "schedule_hour": 9,
        "skip_if_empty": true,
        "slack_channel": null,
        "test_pulse": false,
        "type_id": 1,
        "recipients": []
      },
      "relationships": {
        "organization": {
          "data": {
            "type": "organizations",
            "id": "1033"
          }
        },
        "creator": {
          "meta": {
            "included": false
          }
        },
        "filter": {
          "meta": {
            "included": false
          }
        },
        "memberships": {
          "meta": {
            "included": false
          }
        }
      }
    },
    {
      "id": "3",
      "type": "pulses",
      "attributes": {
        "deactivated_at": null,
        "document_format_id": 1,
        "export_params": {},
        "repeat_schedule_id": 1,
        "schedule_day_id": null,
        "schedule_frame_id": null,
        "schedule_hour": 9,
        "skip_if_empty": true,
        "slack_channel": null,
        "test_pulse": false,
        "type_id": 1,
        "recipients": []
      },
      "relationships": {
        "organization": {
          "data": {
            "type": "organizations",
            "id": "1033"
          }
        },
        "creator": {
          "meta": {
            "included": false
          }
        },
        "filter": {
          "meta": {
            "included": false
          }
        },
        "memberships": {
          "meta": {
            "included": false
          }
        }
      }
    }
  ],
  "links": {
    "first": "http://api-test.productive.io/api/v2/pulses?page%5Bnumber%5D=1&page%5Bsize%5D=30",
    "last": "http://api-test.productive.io/api/v2/pulses?page%5Bnumber%5D=1&page%5Bsize%5D=30"
  },
  "meta": {
    "current_page": 1,
    "total_pages": 1,
    "total_count": 3,
    "page_size": 30,
    "max_page_size": 200
  }
}

Get pulses
GET/api/v2/pulses


GET /api/v2/pulses/1
Requestsreturns pulse

GET  /api/v2/pulses/4

Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+json
Responses200
Headers
Content-Type: application/vnd.api+json; charset=utf-8
Body
{
  "data": {
    "id": "4",
    "type": "pulses",
    "attributes": {
      "deactivated_at": null,
      "document_format_id": 1,
      "export_params": {},
      "repeat_schedule_id": 1,
      "schedule_day_id": null,
      "schedule_frame_id": null,
      "schedule_hour": 9,
      "skip_if_empty": true,
      "slack_channel": null,
      "test_pulse": false,
      "type_id": 1,
      "recipients": []
    },
    "relationships": {
      "organization": {
        "data": {
          "type": "organizations",
          "id": "1034"
        }
      },
      "creator": {
        "meta": {
          "included": false
        }
      },
      "filter": {
        "meta": {
          "included": false
        }
      },
      "memberships": {
        "meta": {
          "included": false
        }
      }
    }
  },
  "meta": {}
}

Gets a pulse
GET/api/v2/pulses/{id}

URI Parameters
HideShow
id
number (required) Example: 1

pulse id


POST /api/v2/pulses
Requestscreates the pulsereturns error

POST  /api/v2/pulses

Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+json
Body
{
  "data": {
    "type": "pulses",
    "attributes": {
      "id": null,
      "account_id": 1035,
      "filter_id": 33,
      "created_at": null,
      "updated_at": null,
      "deleted_at": null,
      "skip_if_empty": true,
      "repeat_schedule_id": 1,
      "schedule_hour": 9,
      "schedule_day_id": null,
      "schedule_frame_id": null,
      "creator_id": 3864,
      "updater_id": null,
      "export_params": {},
      "document_format_id": 1,
      "type_id": 1,
      "slack_channel": null,
      "test_pulse": false,
      "deactivated_at": null,
      "last_scheduled_at": null,
      "version": null,
      "recipients": [
        "admin@productive.io"
      ],
      "last_sent_at": null
    }
  }
}
Responses201
Headers
Content-Type: application/vnd.api+json; charset=utf-8
Body
{
  "data": {
    "id": "5",
    "type": "pulses",
    "attributes": {
      "deactivated_at": null,
      "document_format_id": 1,
      "export_params": {},
      "repeat_schedule_id": 1,
      "schedule_day_id": null,
      "schedule_frame_id": null,
      "schedule_hour": 9,
      "skip_if_empty": true,
      "slack_channel": null,
      "test_pulse": false,
      "type_id": 1,
      "recipients": [
        "admin@productive.io"
      ]
    },
    "relationships": {
      "organization": {
        "data": {
          "type": "organizations",
          "id": "1035"
        }
      },
      "creator": {
        "meta": {
          "included": false
        }
      },
      "filter": {
        "meta": {
          "included": false
        }
      },
      "memberships": {
        "meta": {
          "included": false
        }
      }
    }
  },
  "meta": {}
}

POST  /api/v2/pulses

Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+json
Body
{
  "data": {
    "type": "pulses",
    "attributes": {
      "id": null,
      "account_id": 1045,
      "filter_id": 0,
      "created_at": null,
      "updated_at": null,
      "deleted_at": null,
      "skip_if_empty": true,
      "repeat_schedule_id": 1,
      "schedule_hour": 9,
      "schedule_day_id": null,
      "schedule_frame_id": null,
      "creator_id": 3884,
      "updater_id": null,
      "export_params": {},
      "document_format_id": 1,
      "type_id": 1,
      "slack_channel": null,
      "test_pulse": false,
      "deactivated_at": null,
      "last_scheduled_at": null,
      "version": null,
      "recipients": [
        "admin@productive.io"
      ],
      "last_sent_at": null
    }
  }
}
Responses422
Headers
Content-Type: application/vnd.api+json; charset=utf-8
Body
{
  "errors": [
    {
      "status": "422",
      "code": "invalid_attribute",
      "title": "Invalid Attribute",
      "detail": "attribute is invalid",
      "source": {
        "pointer": "data/attributes/filter"
      }
    }
  ]
}

Creates a pulse
POST/api/v2/pulses

URI Parameters
HideShow
filter_id
number (required) Example: 1

filter id

type_id
number (optional) Example: 1

how is the pulse delivered (1: email - default, 2: slack)

skip_if_empty
boolean (required) Example: true

if set to true, pulse won’t be sent when there is no data in the report

repeat_schedule_id
number (required) Example: 1

how often is the pulse sent (1: daily, 2: weekly, 3: monthly)

schedule_hour
number (required) Example: 9

time the pulse is sent (0-23)

schedule_day_id
number (required) Example: 1

day in week when the pulse is sent (1: monday, …, 7: sunday)

schedule_frame_id
number (required) Example: 1

when pulse is sent monthly, frame determins if sent on first(id: 1)/last(id: 2) schedule_day of the month, or in the middle(id: 3) of the month (15th)

recipients
array (optional) Example: %5B%22external1%40example.com%22%2C+%22external2%40example.com%22%5D

Extra email recipients which are not linked to a user from the app. Productive users are added as recipients through Memberships.


PATCH /api/v2/pulses/12
Requestsupdates pulsereturns errorsends pulse

PATCH  /api/v2/pulses/10

Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+json
Body
{
  "data": {
    "type": "pulses",
    "attributes": {
      "schedule_hour": 15,
      "recipients": [
        "admin@productive.io"
      ]
    }
  }
}
Responses200
Headers
Content-Type: application/vnd.api+json; charset=utf-8
Body
{
  "data": {
    "id": "10",
    "type": "pulses",
    "attributes": {
      "deactivated_at": null,
      "document_format_id": 1,
      "export_params": {},
      "repeat_schedule_id": 1,
      "schedule_day_id": null,
      "schedule_frame_id": null,
      "schedule_hour": 15,
      "skip_if_empty": true,
      "slack_channel": null,
      "test_pulse": false,
      "type_id": 1,
      "recipients": [
        "admin@productive.io"
      ]
    },
    "relationships": {
      "organization": {
        "data": {
          "type": "organizations",
          "id": "1047"
        }
      },
      "creator": {
        "meta": {
          "included": false
        }
      },
      "filter": {
        "meta": {
          "included": false
        }
      },
      "memberships": {
        "meta": {
          "included": false
        }
      }
    }
  },
  "meta": {}
}

PATCH  /api/v2/pulses/11

Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+json
Body
{
  "data": {
    "type": "pulses",
    "attributes": {
      "schedule_hour": null
    }
  }
}
Responses422
Headers
Content-Type: application/vnd.api+json; charset=utf-8
Body
{
  "errors": [
    {
      "status": "422",
      "code": "invalid_attribute",
      "title": "Invalid Attribute",
      "detail": "can't be blank",
      "source": {
        "pointer": "data/attributes/schedule_hour"
      }
    },
    {
      "status": "422",
      "code": "invalid_attribute",
      "title": "Invalid Attribute",
      "detail": "is not included in the list",
      "source": {
        "pointer": "data/attributes/schedule_hour"
      }
    }
  ]
}

PATCH  /api/v2/pulses/12/send

Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+json
Responses200
Headers
Content-Type: text/html

Updates a pulse
PATCH/api/v2/pulses/{id}

URI Parameters
HideShow
id
number (required) Example: 12

DELETE /api/v2/pulses/1
Requestsdeletes pulse

DELETE  /api/v2/pulses/13

Headers
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Content-Type: application/vnd.api+json
Responses204
This response has no content.

Deletes a pulse
DELETE/api/v2/pulses/{id}

URI Parameters
HideShow
id
number (required) Example: 1

pulse id


Generated by aglio on 26 Sep 2025