API Documentation

Read data from BeeBole or write data to BeeBole

Introduction

Welcome to the BeeBole API documentation.

The goal of the API is to open the data associated with your account and give you the possibility to integrate with or to build custom applications (time entry gadget, reports, ...). The API provides a full set of services allowing you to create, update, list and delete time entries in your timesheet.

Table of Contents

If you have any question or problem, please contact us

Authentication

To enable the API, go to your account, and click the top right menu: Settings.
Then locate the module: Account.
Click the line labelled: Enable/Disable API calls.
And tick the box to enable the API for your account, as below:

Enable/Disable API

Then, each user will find their respective token in the 'API Token' module. From there it will be also possible to reset it and get a new one:

API Token

For every API request, you'll need to present this token using basic HTTP authentication. You will use the token in the username field of the HTTP authorization header. The password field will always be "x".

Here is how you will define your authorization's HTTP header:

1) a username:password pair:
"803b433162432915ce2e7b25a022910925ab73c2:x"
2) base64 encode it:
"ODAzYjQzMzE2MjQzMjkxNWNlMmU3YjI1YTAyMjkxMDkyNWFiNzNjMjp4"

3) ... and here is your HTTP authorization header:
"Authorization: Basic ODAzYjQzMzE2MjQzMjkxNWNlMmU3YjI1YTAyMjkxMDkyNWFiNzNjMjp4"

Back to top

Limits

To prevent errors and abuses, we limited the API access by user both in terms of:

  • transfer volume: 1024KB/day
  • and number of requests: 2000 requests/day

If you reach this limit feel free to contact us

Back to top

Request

BeeBole is accepting HTTP POST resquests in a JSON format to the following URL:

https://yourAccount.beebole-apps.com/api

Don't forget the https as all the BeeBole API communication with the server will be encrypted.

Data should be UTF-8 encoded.
Date and time values are of the form YYYY-MM-DD HH:MM:SS.

Each request will be composed of a "service" node and the rest of parameters.
Example:

1
2
3
4
{
"service": "absence.list",
"company_id": 3
}

Note: in order to quickly test the API calls, we encourage you to install and use cURL. Here is the curl command corresponding to the code portion above:
curl -k -X POST https://803b433162432915ce2e7b25a022910925ab73c2:x@yourClientAlias.beebole-apps.com/api -d '{"service":"absence.list", "company_id":3}'

Back to top

Response

Each response will return a "status" node with the value "ok" or "error". Along with an error status you will always find a "message" node containing an explanation of what the error is.

Examples:

request to the server

1
2
3
4
{
  "status": "ok",
  "absences": [ ... ]
}

response from the server

1
2
3
4
{
  "status": "error",
  "message": "Invalid service request ..."
}
Back to top

Absence

absence.list


1
2
3
4
{
  "service": "absence.list",
  "company_id": 3
}


1
2
3
4
5
6
7
8
{     
  "status":"ok",
  "absences":[
    {"id":17,"name":"Sickness"},
    {"id":16,"name":"Leave"},
    {"id":15,"name":"Holidays"}
  ]
}
Back to top

Company

company.list


1
2
3
{
  "service": "company.list"
}


1
2
3
4
5
6
7
{
  "status":"ok", 
  "companies":[
    {"id":3,"name":"BeeBole"},
    {"id":23,"name":"Electracom"}
  ]
}
Back to top

Person

person.list

1
2
3
4
{
  "service": "person.list",
  "company_id": 3 //optional
}


1
2
3
4
5
6
7
{
  "status":"ok",
  "people":[
    {"id":21,"name":"Michael Cvilic"},
    {"id":2,"name":"Hughes Waroquier"}
  ]
}
Back to top

Project

project.list

1
2
3
4
{
  "service": "project.list",
  "company_id": 3 //optional
}


1
2
3
4
5
6
7
{
  "status":"ok",
  "projects":[
    {"id":19,"name":"Admin"},
    {"id":18,"name":"Dev"}
  ]
}
Back to top

Subproject

subproject.list

1
2
3
4
{
  "service": "subproject.list",
  "project_id": 18
}

1
2
3
4
5
6
{
  "subprojects":[
    {"id":25,"name":"Prototype"},
    {"id":24,"name":"API"}
  ]
}

Task

task.list

1
2
3
4
{
  "service": "task.list",
  "company_id": 3
}


1
2
3
4
5
6
{
  "status":"ok",
  "tasks":[
    {"id":29,"name":"Code"}
  ]
}
Back to top

Time

This section deals with the timesheet entries management.

We will call "entity" a company, a project, a subproject, a task or an absence.

In order to log hours on an entity you will follow those simple rules :

  • You can log time on a combination of a company, a project or a subproject with a task if any(mandatory) or on an absence
  • You can only log hours on the leaves of the following hierarchical structure :
    company
    project
    sub project
Examples:

If a company has projects and the project you choose has subprojects and moreover general tasks are defined, you will enter the create/update service with the following parameters:
suproject_id
task_id


without tasks:
subproject_id

if a company has only projects:
project_id
task_id
(if any)

if the company doesn't have any projects:
company_id
task_id
(if any)

if you log hours on an absence (tasks don't matter in this case):
absence_id

To sum up, you get the entity ids and hierarchy with the service get_entities and create or update a time entry following the rules mentioned. In case of you try to log hours on inappropriate entities, you will receive an error message along with a list of entities(children) proposal.

time.create

1
2
3
4
5
6
7
8
{
  "service": "time_entry.create",
  "subproject_id": 25, //company_id, project_id, subproject_id or absence_id
  "task_id": 29,
  "date": "2011-01-05",
  "hours": 8,
  "notes": "some comment"
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
  "status":"ok",
  "timeEntry":{
    "hours":8.0,
    "status":"d",
    "subproject":{
      "id":25,
      "name":"Prototype"
    },
    "task":{
      "name":"Code",
      "id":29
    },
    "id":16,
    "date":"2011-01-06",
    "notes":"some comment"
  }
}

time.get

1
2
3
4
{
  "service": "time_entry.list"
  "id": 16
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
 "status":"ok",
 "timeEntry":{
     "hours":7.0,
     "status":"d",
     "subproject":{
       "id":25,
       "name":"Prototype"
     },
     "task":{
       "name":"Code",
       "id":29
     },
     "id":16,
     "date":"2011-01-06",
     "notes":"another comment"
   }
}

time.get_entities

1
2
3
4
5
{
  "service": "time_entry.get_entities"
  "person_id": 21 // optional
  "format": "tree" // optional, "tree"(default) or "flat"
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
{
  "status":"ok",
  "companies":[
    {
      "name":"BeeBole",
      "id":3,
      "projects":[
        {
          "name":"Dev",
          "id":18,
          "subprojects":[
            {"id":25,"name":"Prototype"},
            {"id":24,"name":"API"}
          ]
        },
        {"id":19,"name":"Admin"}
      ]
    },
    ...
  ],
  "absences":[
    {"id":15,"name":"Holidays"},
    {"id":16,"name":"Leave"},
    {"id":17,"name":"Sickness"}
  ],
  "tasks":[
    {"id":29,"name":"Code"}
  ]
}

← Flat


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{
  "status":"ok",
  "entities":[
    {
      "subproject":{
        "name":"Prototype",
        "id":25,
        "parents":[
          {
            "company":{
              "id":3,
              "name":"BeeBole"
          	}
          },
          {
            "project:{
              "id":18,
              "name":"Dev"
            }
          }
        ]
      },
    ...
  ],
  "absences":[
    {"id":15,"name":"Holidays"},
    {"id":16,"name":"Leave"},
    {"id":17,"name":"Sickness"}
  ],
  "tasks":[
    {"task_id":29,"task_name":"Code"}
  ]
}

time.list

1
2
3
4
5
6
{
 "service": "time_entry.list"
 "person_id": 21 //optional
 "from": "2011-01-03",
 "to": "2011-01-09"
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
 "status":"ok",
 "timeEntries":[
   {
     "hours":7.0,
     "status":"d",
     "subproject":{
       "id":25,
       "name":"Prototype"
     },
     "task":{
       "name":"Code",
       "id":29
     },
     "id":16,
     "date":"2011-01-06",
     "notes":"another comment"
   },
   ...
 ]
}

time.update

1
2
3
4
5
6
7
8
9
{
  "service": "time_entry.update"
  "id":16,
  "subproject_id": 25, //company_id, project_id, subproject_id or absence_id
  "task_id": 29, //mandatory if existing and not absence_id
  "date": "2011-01-05",
  "hours": 7,
  "notes": "another comment"
}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
  "status":"ok",
  "timeEntry":{
    "hours":7.0,
    "status":"d",
    "subproject":{
      "id":25,
      "name":"Prototype"
    },
    "task":{
      "name":"Code",
      "id":29
    },
    "id":16,
    "date":"2011-01-05",
    "notes":"another comment"
  }
}
Back to top