Contractor portal
A contractor's own hours, pay, agreements and profile, with a contractor sign-in.
43 actions
Give an AI assistant only these actions with the contractor MCP toolset.
https://app.getoatmilk.com/api/mcp?toolset=contractoragreement
agreements
- GET
agreements.downloadGet a one-minute download link for an agreement sent to you, optionally one version. - GET
agreements.getRead one agreement sent to you, with its status, version and your signature events. - GET
agreements.listList the agreements sent to you for signature, with each one's status and version.
history
home
hours
- POST
hours.amendChange one of your submitted time entries (date, minutes, description, and optionally the custom field values) with its expectedRevision, as long as nobody has reviewed it yet. It stays submitted, and a reviewer who already opened it is told it changed. - POST
hours.createLog time: a date (not in the future, and not in a pay period that was already paid), minutes and a description, as a draft to submit with your timesheet. A day can't add up to more than 24 hours. The same work on the same day twice is refused unless confirmDuplicate is true. - GET
hours.formRead the custom fields you fill in for each time entry. - GET
hours.listList your own time entries, optionally from and to dates. - POST
hours.submitSubmit one of your time entries for approval with its expectedRevision, once the hours form's required fields are filled in. - POST
hours.updateChange one of your draft or returned time entries (date, minutes, description) with its expectedRevision. The same rules as logging time apply. - POST
hours.withdrawTake a submitted time entry back to draft with its expectedRevision, before it's reviewed.
hours.correction
- POST
hours.correction.requestReport a mistake in one of your approved time entries (hoursId, its expectedRevision, the corrected date, minutes and description, and a reason). The approved entry stays as it is and is held out of payouts until finance decides. Hours that were already paid are raised with finance as an adjustment instead. One correction can be open per entry. - POST
hours.correction.withdrawTake back a correction you reported (correctionId) before finance decides on it, so the entry can be paid as approved.
hours.details
identity
invoice
onboarding
organizations
payment
payments
payouts
- GET
payouts.listRead your own payouts and when they were sent. - GET
payouts.statementDownload a payment statement (PDF) for one of your paid payouts by id: what it was for, fees, GST/HST, total and date. It isn't a pay stub. - GET
payouts.summaryDownload a summary (PDF) of your payments in a calendar year (calendarYear), with totals by currency before and after GST/HST, for your own tax return.
profile
reminders
requests
signatures
- POST
signatures.acceptAccept and sign an agreement in your own portal session, after reviewing the exact version. Only you can, interactively; agents can't sign for you. - POST
signatures.declineDecline an agreement with a reason, in your own portal session. Only you can, interactively; agents can't decide for you. - POST
signatures.prepareStart signing an agreement in your own portal session. Only you can, interactively; agents can't sign for you. - GET
signatures.statusRead where your signature on an agreement stands.
taxInfo
- GET
taxInfo.getRead your own tax numbers, shown only partly, and what your tax slip still needs: your SIN or business number and a complete mailing address. - POST
taxInfo.saveAdd, replace or remove one of your tax numbers (SIN, business number, ITN, or your country's tax number) for your tax slips. It's stored encrypted and only ever shown partly again. Add or replace a tax number in your contractor portal. Agents and API tokens can't handle full tax numbers.
timesheet
- POST
timesheet.fillFill one of your own empty current or past pay periods with draft time entries copied from the last period or your usual pattern. Dates, hours, and reusable form answers can be reviewed before submission. - GET
timesheet.getRead one of your pay periods, by id or by a date in it, with its entries, custom fields, due date, pay date, and any hour limits in your agreement with how many hours are left this week, this month and in total. - POST
timesheet.noHoursMark your own empty pay period as having no hours, or undo your own report before finance skips it. - POST
timesheet.submitSubmit all of your draft entries in a pay period (by id, or by a date in it when the dates aren't in a scheduled pay period) after required custom fields are filled in, in one step: either all of them go to review or none do. Skipped and paid periods can't take hours.