26 February, 2024
by Tony Rule- Add support for adding people to a skill
- Improved performance for GET /projects
- Improved PATCH /project-tags to support removal
See API v1 usage instructions. While the API v1 is still in beta this changelog is a living document.
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.
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
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.
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).
person_id becomes personIdGET /v0/time_offs becomes GET /time-offs/v0 prefix on pathsPUT to PATCH{values: []} objectChanged 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"}
]Changed tags format on all endpoints. Retrieve tag identifiers from GET /project-tags.
Before:
["My Tag", "My Other Tag"]
After:
[{id: 1}, {id: 2}]
GET /invitations: sentDate attribute renamed to sentAtPOST /actuals: No longer allows clearing phases with empty strings, requires phaseId=nullPOST /actuals: No longer auto-fills gaps (autofill=true)GET /actuals: Date filtering parameters renamed to minDate and maxDateGET /actuals: No longer returns updated_at or origin_dataGET /assignments: Renamed date filtering parameters to startDate and endDateGET /assignments: No longer returns total_minutes, use Reporting API insteadGET /assignments: Renamed active to isActiveGET /clients: Removed include_archived filterGET /clients, POST /clients: Removed projectsGET /clients: Renamed url to websiteGET /clients, POST /clients, PATCH /clients: Renamed archived to isArchivedGET /contracts: Changed rostered_days to availableDays (keyed by weekday name)GET /milestones, POST /milestones, DELETE /milestones: Moved into /projects/:id/milestones subresourceGET /milestones: Renamed date filtering parameters to startDate and endDateGET /people: Moved role_id and role_name to GET /people/:id/contracts/currentGET /people, GET /people/:id: Moved team_id and team to GET /people/:id/teamsGET /people, GET /people/:id: Moved current_contract to GET /people/:id/contracts/currentGET /people, GET /people/:id: Moved projects to GET /people/:id/projects, removed include_projects parameterGET /people, GET /people/:id: Moved skills to GET /people/:id/skillsGET /people: Removed include_placeholders option, use GET /placeholdersGET /people/:id: Moved assignments to GET /people/:id/assignments, removed include_assignments, start and end parametersGET /people/:id: Moved actuals to GET /people/:id/actuals, removed include_actuals, start and end parametersGET /people/:id: Moved skills to GET /people/:id/skills, removed skills_unstableGET /people/:id: Moved time_offs to GET /people/:id/time-offsGET /people/:id: Moved holidays_unstable to GET /people/:id/time-offs/holidaysGET /people, GET /people/:id: Rename people_notes to notesGET /people: Renamed archived to isArchivedPOST /people: Removed role_name, use role_idGET /phases: Moved to GET /projects/:id/phasesPOST /placeholders: Create placeholders so you can then create assignments for placeholders on projects (retaining functionality from v0)GET /project_notes: Moved to GET /projects/:id/notesPOST /project_notes: Moved to POST /projects/:id/notesPOST /project_notes: Removed ability to set user_id, defaults to “API” userGET /projects: Includes template projects by default (filter manually based on isTemplate property)GET /projects/:id: Moved assignments to GET /projects/:id/assignments, removed include_assignments optionGET /projects/:id: Moved actuals to GET /projects/:id/actuals, removed include_actuals optionGET /projects/:id: Moved milestones to GET /projects/:id/milestonesGET /projects/:id: Moved other_expenses to GET /projects/:id/other-expensesGET /projects/:id: Moved project_rates to GET /projects/:id/project-ratesGET /projects/:id: Moved phases to GET /projects/:id/phasesGET /projects/:id: Moved timesheet_locked_to to GET /projects/:id/timesheet-lockGET /projects/:id/people: retaining functionality from v0POST /projects, PATCH /projects/:id: Removed project_ratesPOST /projects, PATCH /projects/:id: Renamed confirmed to isConfirmedPOST /projects/:id/project-rates and PATCH /projects/:id/project-ratesPUT /projects/:id/lock_timesheets: Moved to PATCH /projects/:id/timesheet-lockGET /rate-cards: Changed blended_rate_hourly and blended_rate_daily to blendedRate and rateTypeGET /rate-cards: Renamed archived to isArchivedPOST /roles, PATCH /roles: Changed people to personIdsPOST /skills/:id/people: retaining functionality from v0GET /teams, POST /teams, PATCH /teams/:id: Removed people, use /people/:id/teams to identify and modify team membershipGET /time-offs: Removed type, split into separate subresources: GET /time-offs/leave, GET /time-offs/rostered-off.GET /time_offs/holidays_unstable: Moved to GET /time-offs/holidaysGET /users: Changed permissions from serialised JSON strings to an actual objectWe’re still working on these endpoints:
POST /invitations: Requires fromUser (no longer defaulting to first admin)GET /placeholdersGET /people-tags/:id: See all people who have this tagGET /clients/:id/projectsPOST /projects/:id/other-expenses and PATCH /projects/:id/other-expenses/:idGET /assignments: isTemplate and active/custom-fields endpointscustomFields to GET /people/:id and GET /projects/:id/holiday-groupsGET /projects: isTemplate, expensesBudgetGET /rate-cards: List projectIdsGET /reports/*/project-tags endpoints{id}