API v1 Beta now available for all customers
- Added tags on response to GET /projects
- Added includePlaceholders filter for GET /people
- Added GET /projects/:id/people
- Replaced GET /milestones with GET /projects/:id/milestones
- API v1 beta release notes
See API v1 usage instructions. While the API v1 is still in beta this changelog is a living document.
v1.0.0
URL
The base URL for using API v1 is https://api.runn.io (this has changed from v0).
Note: Refer to “Accounts > Settings > API” for your specific API endpoint URL, it might differ from the above.
Accept-Version Header
We now require passing an Accept-Version header, specifying the version of the API you’d like to use.
Example: Accept-Version: 1.0.0
Pagination
Changed from page-based to cursor-based pagination. Instead of per_page, use limit. Instead of page, use the cursor provided as nextCursor in the previous API response.
Identifiers
We've switched from hashids to numeric identifiers to identify resources.
Before:
/v0/people/156ocz
After:
/people/123
In order to convert existing references to the new format, we have provided a /legacy-id endpoint.
To convert the example above, use the following request:
GET /legacy-id/people/156ocz
You also have the option to convert these values locally for better performance.
Here's an example Python implementation, which you can adapt to a programming language of your choice (using one of the many implementations on hashids.org).
Naming Format
- Changed all property and parameter names from lower snakecase to camelcase:
person_idbecomespersonId - Changed endpoint paths from snakecase to dashcase. Example:
GET /v0/time_offsbecomesGET /time-offs
Request and Response Structure
- Dropped the
/v0prefix on paths - Changed HTTP verbs from
PUTtoPATCH - Collection endpoint results are nested in a
{values: []}object
References Format
Changed references format on all endpoints.
Before:
{
"My Name": {"external_id": "My ID"},
"My Other Name": {"external_id": "My Other ID"}
}After:
[
{"referenceName": "My Name", "externalId": "My ID"},
{"referenceName": "My Other Name", "externalId": "My Other ID"}
]Tags Format
Changed tags format on all endpoints. Retrieve tag identifiers from GET /project-tags.
Before:
["My Tag", "My Other Tag"]
After:
[{id: 1}, {id: 2}]
Endpoint Specific Changes
GET /invitations:sentDateattribute renamed tosentAtPOST /actuals: No longer allows clearing phases with empty strings, requiresphaseId=nullPOST /actuals: No longer auto-fills gaps (autofill=true)GET /actuals: Date filtering parameters renamed tominDateandmaxDateGET /actuals: No longer returnsupdated_atororigin_dataGET /assignments: Renamed date filtering parameters tostartDateandendDateGET /assignments: No longer returnstotal_minutes, use Reporting API insteadGET /assignments: RenamedactivetoisActiveGET /clients: Removedinclude_archivedfilterGET /clients,POST /clients: Removed projectsGET /clients: RenamedurltowebsiteGET /clients,POST /clients,PATCH /clients: RenamedarchivedtoisArchivedGET /contracts: Changedrostered_daystoavailableDays(keyed by weekday name)GET /milestones,POST /milestones,DELETE /milestones: Moved into/projects/:id/milestonessubresourceGET /milestones: Renamed date filtering parameters tostartDateandendDateGET /people: Movedrole_idandrole_nametoGET /people/:id/contracts/currentGET /people,GET /people/:id: Movedteam_idandteamtoGET /people/:id/teamsGET /people,GET /people/:id: Movedcurrent_contracttoGET /people/:id/contracts/currentGET /people,GET /people/:id: MovedprojectstoGET /people/:id/projects, removedinclude_projectsparameterGET /people,GET /people/:id: MovedskillstoGET /people/:id/skillsGET /people: Removedinclude_placeholdersoption, useGET /placeholdersGET /people/:id: Moved assignments toGET /people/:id/assignments, removedinclude_assignments,startandendparametersGET /people/:id: MovedactualstoGET /people/:id/actuals, removedinclude_actuals,startandendparametersGET /people/:id: MovedskillstoGET /people/:id/skills, removedskills_unstableGET /people/:id: Movedtime_offstoGET /people/:id/time-offsGET /people/:id: Movedholidays_unstabletoGET /people/:id/time-offs/holidaysGET /people,GET /people/:id: Renamepeople_notestonotesGET /people: RenamedarchivedtoisArchivedPOST /people: Removedrole_name, userole_idGET /phases: Moved toGET /projects/:id/phasesPOST /placeholders: Create placeholders so you can then create assignments for placeholders on projects (retaining functionality from v0)GET /project_notes: Moved toGET /projects/:id/notesPOST /project_notes: Moved toPOST /projects/:id/notesPOST /project_notes: Removed ability to setuser_id, defaults to “API” userGET /projects: Includes template projects by default (filter manually based onisTemplateproperty)GET /projects/:id: Moved assignments toGET /projects/:id/assignments, removedinclude_assignmentsoptionGET /projects/:id: Moved actuals toGET /projects/:id/actuals, removedinclude_actualsoptionGET /projects/:id: MovedmilestonestoGET /projects/:id/milestonesGET /projects/:id: Movedother_expensestoGET /projects/:id/other-expensesGET /projects/:id: Movedproject_ratestoGET /projects/:id/project-ratesGET /projects/:id: MovedphasestoGET /projects/:id/phasesGET /projects/:id: Movedtimesheet_locked_totoGET /projects/:id/timesheet-lockGET /projects/:id/people: retaining functionality from v0POST /projects,PATCH /projects/:id: Removedproject_ratesPOST /projects,PATCH /projects/:id: RenamedconfirmedtoisConfirmedPOST /projects/:id/project-ratesandPATCH /projects/:id/project-ratesPUT /projects/:id/lock_timesheets: Moved toPATCH /projects/:id/timesheet-lockGET /rate-cards: Changedblended_rate_hourlyandblended_rate_dailytoblendedRateandrateTypeGET /rate-cards: RenamedarchivedtoisArchivedPOST /roles,PATCH /roles: ChangedpeopletopersonIdsPOST /skills/:id/people: retaining functionality from v0GET /teams,POST /teams,PATCH /teams/:id: Removedpeople, use/people/:id/teamsto identify and modify team membershipGET /time-offs: Removedtype, split into separate subresources:GET /time-offs/leave,GET /time-offs/rostered-off.GET /time_offs/holidays_unstable: Moved toGET /time-offs/holidaysGET /users: Changedpermissionsfrom serialised JSON strings to an actual object
Unreleased
We’re still working on these endpoints:
POST /invitations: RequiresfromUser(no longer defaulting to first admin)GET /placeholdersGET /people-tags/:id: See all people who have this tagGET /clients/:id/projectsPOST /projects/:id/other-expensesandPATCH /projects/:id/other-expenses/:id
New
GET /assignments:isTemplateandactive/custom-fieldsendpoints- Add
customFieldstoGET /people/:idandGET /projects/:id - List public holidays separately from people through
/holiday-groups GET /projects:isTemplate,expensesBudgetGET /rate-cards: ListprojectIds- New reports API:
GET /reports/* /project-tagsendpoints
