API Documentation

API Endpoint

Timers

Timers

Timer is an object belonging to a Time Entry.

Timer represents one time tracking sessions (on a time entry) and keeps track when a session was started and when it was stopped.

Timer object gets created when a person starts a timer.

Creating a Timer is possible (on API) providing either time_entry_id or service_id in parameters.

  • When providing time_entry_id, a Timer object will be related to provided Time Entry.

  • When providing service_id, new Time Entry belonging to provided Service will be created and a Timer will belong to it.

Timer diagram

You can find out more about Timers in our [Help documentation] (https://help.productive.io/en/articles/3903111-timer)

Supported filter params

  • time_entry_id

  • person_id

  • started_at (date)

  • stopped_at (date)

Supported sort params

  • started_at

  • stopped_at

GET /api/v2/timers
Requestsreturns timers

GET  /api/v2/timers

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": "9",
      "type": "timers",
      "attributes": {
        "person_id": 8779,
        "started_at": "2025-08-02T01:21:26.000+02:00",
        "stopped_at": null,
        "total_time": 0
      },
      "relationships": {
        "organization": {
          "data": {
            "type": "organizations",
            "id": "2149"
          }
        },
        "time_entry": {
          "meta": {
            "included": false
          }
        }
      }
    },
    {
      "id": "10",
      "type": "timers",
      "attributes": {
        "person_id": 8779,
        "started_at": "2025-08-02T01:21:26.000+02:00",
        "stopped_at": null,
        "total_time": 0
      },
      "relationships": {
        "organization": {
          "data": {
            "type": "organizations",
            "id": "2149"
          }
        },
        "time_entry": {
          "meta": {
            "included": false
          }
        }
      }
    }
  ],
  "links": {
    "first": "http://api-test.productive.io/api/v2/timers?page%5Bnumber%5D=1&page%5Bsize%5D=30",
    "last": "http://api-test.productive.io/api/v2/timers?page%5Bnumber%5D=1&page%5Bsize%5D=30"
  },
  "meta": {
    "current_page": 1,
    "total_pages": 1,
    "total_count": 2,
    "page_size": 30,
    "max_page_size": 200
  }
}

Get timers
GET/api/v2/timers


GET /api/v2/timers/1
Requestsreturns timer

GET  /api/v2/timers/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
Responses200
Headers
Content-Type: application/vnd.api+json; charset=utf-8
Body
{
  "data": {
    "id": "11",
    "type": "timers",
    "attributes": {
      "person_id": 8784,
      "started_at": "2025-08-02T01:21:26.000+02:00",
      "stopped_at": null,
      "total_time": 0
    },
    "relationships": {
      "organization": {
        "data": {
          "type": "organizations",
          "id": "2150"
        }
      },
      "time_entry": {
        "meta": {
          "included": false
        }
      }
    }
  },
  "meta": {}
}

Gets a timer
GET/api/v2/timers/{id}

URI Parameters
HideShow
id
number (required) Example: 1

timer id


POST /api/v2/timers
Requestscreates timer and tracks intercom eventcreates timercreates timer related to time_entryreturns error

POST  /api/v2/timers

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": "timers",
    "attributes": {},
    "relationships": {
      "time_entry": {
        "data": {
          "type": "time_entries",
          "id": "364"
        }
      }
    }
  }
}
Responses201
Headers
Content-Type: application/vnd.api+json; charset=utf-8
Body
{
  "data": {
    "id": "12",
    "type": "timers",
    "attributes": {
      "person_id": 8786,
      "started_at": "2025-08-02T02:21:26.000+02:00",
      "stopped_at": null,
      "total_time": 0
    },
    "relationships": {
      "organization": {
        "data": {
          "type": "organizations",
          "id": "2151"
        }
      },
      "time_entry": {
        "meta": {
          "included": false
        }
      }
    }
  },
  "meta": {}
}

POST  /api/v2/timers

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": "timers",
    "attributes": {
      "service_id": "1294"
    },
    "relationships": {}
  }
}
Responses201
Headers
Content-Type: application/vnd.api+json; charset=utf-8
Body
{
  "data": {
    "id": "13",
    "type": "timers",
    "attributes": {
      "person_id": 8788,
      "started_at": "2025-08-02T02:21:26.000+02:00",
      "stopped_at": null,
      "total_time": 0
    },
    "relationships": {
      "organization": {
        "data": {
          "type": "organizations",
          "id": "2152"
        }
      },
      "time_entry": {
        "meta": {
          "included": false
        }
      }
    }
  },
  "meta": {}
}

POST  /api/v2/timers

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": "timers",
    "attributes": {
      "service_id": "1296"
    },
    "relationships": {
      "time_entry": {
        "data": {
          "type": "time_entries",
          "id": "366"
        }
      }
    }
  }
}
Responses201
Headers
Content-Type: application/vnd.api+json; charset=utf-8
Body
{
  "data": {
    "id": "14",
    "type": "timers",
    "attributes": {
      "person_id": 8790,
      "started_at": "2025-08-02T02:21:27.000+02:00",
      "stopped_at": null,
      "total_time": 0
    },
    "relationships": {
      "organization": {
        "data": {
          "type": "organizations",
          "id": "2153"
        }
      },
      "time_entry": {
        "meta": {
          "included": false
        }
      }
    }
  },
  "meta": {}
}

POST  /api/v2/timers

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": "timers",
    "attributes": {},
    "relationships": {
      "time_entry": {
        "data": {
          "type": "time_entries",
          "id": ""
        }
      }
    }
  }
}
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/service"
      }
    }
  ]
}

Create an timer
POST/api/v2/timers

URI Parameters
HideShow
time_entry_id
number (optional) Example: 1

required if service_id not provided

service_id: `1` (number, optional) - required if time_entry_id not provided
string (required) 

PATCH /api/v2/timers/1/stop
Requestsstops timer and tracks intercom event

PATCH  /api/v2/timers/16/stop

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": "16",
    "type": "timers",
    "attributes": {
      "person_id": 8796,
      "started_at": "2025-08-02T01:21:27.000+02:00",
      "stopped_at": "2025-08-02T02:21:27.000+02:00",
      "total_time": 60
    },
    "relationships": {
      "organization": {
        "data": {
          "type": "organizations",
          "id": "2156"
        }
      },
      "time_entry": {
        "meta": {
          "included": false
        }
      }
    }
  },
  "meta": {}
}

Stops a timer
PATCH/api/v2/timers/{id}/stop

URI Parameters
HideShow
id
number (required) Example: 1

timer id


Generated by aglio on 02 Aug 2025