All Collections
How to use the PlusPlus GraphQL API
How to use the PlusPlus GraphQL API

Quickstart instructions on how to retrieve data from your instance

Michael Wallace avatar
Written by Michael Wallace
Updated yesterday

This article is best for system administrators, engineers, and developers. Too small? Click here.


Sample curl request:

curl -H "Authorization: Token " \     
-H "Content-Type: application/json" \
-d '{"query":"{events(first:3){edges{node{pk name}}}}"}"}' \


Content-Type: application/json
Vary: Accept
"data": {
"events": {
"edges": [
"node": {
"pk": 407,
"name": "Agile Training"
"node": {
"pk": 408,
"name": "High Output Management"
"node": {
"pk": 409,
"name": "Core Python"

GraphQL Interactive

To test and play queries to the GraphQL API you can use the interactive interface. It is available to users with Organizer and Admin role at the URL There you will find a “Docs” button at the to right corner of the page where it’s possible to click through the available resources and fields. Also, pay attention to the filters available to each node.


Always use your custom domain as the HOST of your requests.



Get your API token from within the PlusPlus app via Menu > Settings > Developers.

You need to have Admin role.

Authentication is done via the Authorization HTTP header. It should be in the following format:

Authorization: Token {your-api-token}

Notice the word Token before the token value.

Making Queries

To query GraqhQL APIs you will make a POST request to the GraphQL endpoint with the Authorization and Content-Type headers (as shown in the curl example above) and a body with a JSON payload in the following format:

"query": "{ events(first: 3) { edges { node { pk name }}}}"

Notice the string in the query field is the query you would build using the GraphQL Interactive interface.


We recommend using a GraphQL client in the language of your choice to make the requests. They will help you exploring, debugging and testing your application. The official GraphQL website has a list of available clients in many different programming languages:

Resource Lists

Lists of items will always be presented in the structure:

resource { edges { node }}

When requesting a list of items it will be mandatory to specify the maximum number of items to be returned either using the first or last parameter. The maximum number of items per page is 300.


Filters are parameters just like first and after. Use the interactive explorer Docs to find out about which are the available filters for a given resource.

List filters

Some filter parameters allow passing a list of items. Passing more than one item will result in a OR query. Eg.:

query {
events(first: 2, presenter_id: [10, 32])
edges {
node {

The above query will return all the events where at least one presenter is the user with the id 10 or the user with id 32.

Filtering Deleted Items

By default non filtered queries will return all items including deleted ones. You can remove those by filtering them out. To the date of publication of this document all types have a is_deleted field and a is_deleted filter. Eg.:

query { events(first: 2, is_deleted: false) edges { node { pk name } } } }


Use the pageInfo attribute to get paging information. E.g.:

query { events(first: 2) { pageInfo { hasNextPage endCursor } edges { node { pk name } } } }

Will return:

{ "data": { "events": { "pageInfo": { "hasNextPage": true, "endCursor": "YXJyYXljb25uZWN0aW9uOjE=" }, "edges": [ { "node": { "pk": 407, "name": "Agile Training" } }, { "node": { "pk": 408, "name": "High Output Management" } } ] } } }

You can then use the endCursor to fetch the next page:

query { events(first: 2, after: "YXJyYXljb25uZWN0aW9uOjE=") { pageInfo { hasNextPage endCursor } edges { node { pk name } } } }



Datetimes will always be presented using the timezone aware ISO8601 format. E.g.: “2018-05-07T12:00:00-07:00”.

More Examples

You can find more query examples in this article.

Sample Python code

import requests

token = "{your-token-here}"
query = """{
events(first: 300, is_deleted: false) {
pageInfo {
edges {
node {
event_type {

response =
json={"query": query},
"Authorization": f"Token {token}",

data = response.json()


All image URLs returned by GraphQL queries are signed and have an expiration time of 7 days. This is a limitation imposed by our file storage provider AWS S3 and cannot be increased.


In case you have any problems, need help or need any information that is not yet available in the GraphQL API, please contact your PlusPlus system administrator or PlusPlus Support.

See also

Did this answer your question?