---
title: Doing Work API reference
description: All 284 Doing Work operations: what each does, when to use it, inputs, examples, errors, and what to tell the owner.
url: https://doingwork.work/docs/reference/
---

# API reference

284 operations, generated from the core's operation list. The same list makes the [OpenAPI file](https://doingwork.work/openapi.json) and the MCP tools, so they always match.

## Sign-in and agent access

| Operation | What it does | Who |
|---|---|---|
| [auth.requestLink](https://doingwork.work/docs/reference/auth-requestlink/) | Email a one-time sign-in link | Agents can call this |
| [auth.redeemLink](https://doingwork.work/docs/reference/auth-redeemlink/) | Exchange a sign-in link token for a browser session | Hosted page only |
| [auth.oauthRegister](https://doingwork.work/docs/reference/auth-oauthregister/) | Register an OAuth client (RFC 7591 dynamic registration) | Agents can call this |
| [auth.oauthAuthorize](https://doingwork.work/docs/reference/auth-oauthauthorize/) | A signed-in person approves an agent client | Agents can call this |
| [auth.oauthToken](https://doingwork.work/docs/reference/auth-oauthtoken/) | Exchange an authorization code and PKCE verifier, or a refresh token, for a short-lived agent access token and a new refresh token | Agents can call this |
| [me.get](https://doingwork.work/docs/reference/me-get/) | The signed-in person | Agents can call this |
| [keys.create](https://doingwork.work/docs/reference/keys-create/) | Make a named agent key for one shop (owner only) | A person's own sign-in only |
| [keys.list](https://doingwork.work/docs/reference/keys-list/) | List a shop's named agent keys (owner only): label, scopes, audience, when made, last used and revoked | Agents can call this |
| [keys.revoke](https://doingwork.work/docs/reference/keys-revoke/) | Revoke a named agent key (owner only) | Agents can call this |
| [agents.register](https://doingwork.work/docs/reference/agents-register/) | auth.md agent registration | Agents can call this |
| [agents.claim](https://doingwork.work/docs/reference/agents-claim/) | auth.md claim | Agents can call this |
| [agents.approve](https://doingwork.work/docs/reference/agents-approve/) | Hosted claim page only: the shop owner whose email the claim names types the agent's 6 digit code, picks one of their shops and accepts the agent key terms | Hosted page only |
| [agents.deny](https://doingwork.work/docs/reference/agents-deny/) | Hosted claim page only: the person turns the agent down | Hosted page only |
| [legal.documents](https://doingwork.work/docs/reference/legal-documents/) | The legal documents Doing Work asks people to accept, with the current version and a link to the text | Agents can call this |
| [legal.status](https://doingwork.work/docs/reference/legal-status/) | What the signed-in person has accepted: for each document that is accepted here, the current version, the versions accepted and when, and whether the current version still needs accepting | Agents can call this |
| [legal.accept](https://doingwork.work/docs/reference/legal-accept/) | Record that the signed-in person accepts the current version of a legal document (clickwrap) | A person's own sign-in only |

## Shop

| Operation | What it does | Who |
|---|---|---|
| [shops.create](https://doingwork.work/docs/reference/shops-create/) | Create a shop | Agents can call this |
| [quotes.withdraw](https://doingwork.work/docs/reference/quotes-withdraw/) | Withdraw a draft or sent quote the customer has not signed, with an optional reason | Agents can call this |
| [fees.schedule](https://doingwork.work/docs/reference/fees-schedule/) | Doing Work's fee schedule: one stepped rate on each shop's calendar month of card and bank payments, taken out of the payments | Agents can call this |
| [fees.preview](https://doingwork.work/docs/reference/fees-preview/) | What Doing Work would take on a payment of this size right now, the effective rate on it, the month's volume so far (all locations under the same owner), and how far the shop is from the next, cheaper band (owner or office) | Agents can call this |
| [audit.list](https://doingwork.work/docs/reference/audit-list/) | Read a shop's audit log, newest first (owner only) | Agents can call this |
| [customers.get](https://doingwork.work/docs/reference/customers-get/) | One customer with contacts, properties, custom fields and open balance | Agents can call this |
| [customers.list](https://doingwork.work/docs/reference/customers-list/) | Customers of a shop, newest first, filtered by tag, lead source or archived | Agents can call this |
| [customers.search](https://doingwork.work/docs/reference/customers-search/) | Find customers by name, company, email, phone or property address | Agents can call this |
| [customers.update](https://doingwork.work/docs/reference/customers-update/) | Change a customer's name, kind, company, email, phone, billing address, lead source, tags or notes | Agents can call this |
| [customers.archive](https://doingwork.work/docs/reference/customers-archive/) | Archive a customer (hidden from lists, history kept) or bring one back | Agents can call this |
| [customers.duplicates](https://doingwork.work/docs/reference/customers-duplicates/) | Likely duplicate customers in a shop: same email, same phone digits, or same name | Agents can call this |
| [customers.merge](https://doingwork.work/docs/reference/customers-merge/) | Merge a duplicate customer into another: jobs, requests, contacts, properties and fields move over | Agents can call this |
| [customers.contactAdd](https://doingwork.work/docs/reference/customers-contactadd/) | Add a contact person to a customer (tenant, manager, billing, spouse) | Agents can call this |
| [customers.contactUpdate](https://doingwork.work/docs/reference/customers-contactupdate/) | Change or remove one contact of a customer | Agents can call this |
| [jobs.setTags](https://doingwork.work/docs/reference/jobs-settags/) | Set the tags and lead source on a job | Agents can call this |
| [customers.timeline](https://doingwork.work/docs/reference/customers-timeline/) | Everything that happened with a customer, newest first: requests, jobs, quotes, signatures, invoices and payments | Agents can call this |
| [customers.statement](https://doingwork.work/docs/reference/customers-statement/) | A customer's account statement: every invoice with total, paid and balance, and the total owed | Agents can call this |
| [customers.privacyExport](https://doingwork.work/docs/reference/customers-privacyexport/) | Everything the shop holds about one customer, as one JSON document, for a privacy request | Agents can call this |
| [customers.privacyDelete](https://doingwork.work/docs/reference/customers-privacydelete/) | Erase a customer's personal details for a privacy request | A person's own sign-in only |
| [shops.setInvoiceReminders](https://doingwork.work/docs/reference/shops-setinvoicereminders/) | Turn the automatic unpaid-invoice reminder on or off for the whole shop (owner only) | Agents can call this |
| [shops.setContact](https://doingwork.work/docs/reference/shops-setcontact/) | Set the phone and email customers see when they open a canceled invoice or quote link (owner only) | Agents can call this |
| [shops.setFieldCosts](https://doingwork.work/docs/reference/shops-setfieldcosts/) | Let field workers in the shop see job costs (labor cost, material cost, expenses others entered, price book cost), or hide them again (owner only) | Agents can call this |
| [shops.setHubLinkInEmails](https://doingwork.work/docs/reference/shops-sethublinkinemails/) | Turn the customer hub link in quote and invoice emails on or off for the whole shop (owner only) | Agents can call this |
| [invoices.setReminder](https://doingwork.work/docs/reference/invoices-setreminder/) | Turn the automatic unpaid reminder on or off for one invoice (owner or office) | Agents can call this |
| [quotes.respond](https://doingwork.work/docs/reference/quotes-respond/) | Customer declines a quote or asks for changes (hosted page) | Hosted page only |
| [quotes.activity](https://doingwork.work/docs/reference/quotes-activity/) | What the customer has done with a quote: when each version was first opened and how often, and any decline or change request with its note | Agents can call this |
| [shops.setQuoteFollowup](https://doingwork.work/docs/reference/shops-setquotefollowup/) | Set how many days after a quote is sent the customer gets one friendly follow-up email if they have not answered (owner only) | Agents can call this |
| [invoices.create](https://doingwork.work/docs/reference/invoices-create/) | Create an invoice without a quote, from lines the worker wrote (never filled in by AI) | Agents can call this |
| [invoices.createBatch](https://doingwork.work/docs/reference/invoices-createbatch/) | Create many invoices at once (up to 100), each from a job and the lines the worker wrote | Agents can call this |
| [invoices.get](https://doingwork.work/docs/reference/invoices-get/) | One invoice with its lines, what has been paid, the balance, the due date, and whether a bank payment is still clearing | Agents can call this |
| [invoices.pdf](https://doingwork.work/docs/reference/invoices-pdf/) | The invoice as a PDF (base64), with shop, customer, lines, paid so far and balance | Agents can call this |
| [invoices.aging](https://doingwork.work/docs/reference/invoices-aging/) | Accounts receivable aging: every open invoice's balance by how late it is (current, 1-30, 31-60, 61-90, over 90 days past due), with totals per customer (owner or office) | Agents can call this |
| [shops.setTips](https://doingwork.work/docs/reference/shops-settips/) | Turn tips on or off on this shop's invoice pay page (owner only) | Agents can call this |
| [shops.setReviewRequest](https://doingwork.work/docs/reference/shops-setreviewrequest/) | Set the review link (for example your Google review page, https only) and how many days after an invoice is paid the customer gets one email asking for a review (owner only) | Agents can call this |
| [customers.setAutopay](https://doingwork.work/docs/reference/customers-setautopay/) | Turn auto-pay on or off for a customer (owner or office) | Agents can call this |
| [shops.setTaxReportBasis](https://doingwork.work/docs/reference/shops-settaxreportbasis/) | Choose how the sales tax report counts a period (owner only) | Agents can call this |
| [quotes.addAttachment](https://doingwork.work/docs/reference/quotes-addattachment/) | Show an uploaded photo or file of the same job with a quote, with an optional caption | Agents can call this |
| [quotes.removeAttachment](https://doingwork.work/docs/reference/quotes-removeattachment/) | Take a photo or file off a quote | Agents can call this |
| [quotes.listAttachments](https://doingwork.work/docs/reference/quotes-listattachments/) | Photos and files shown with a quote, in order | Agents can call this |
| [media.tag](https://doingwork.work/docs/reference/media-tag/) | Add or remove tags on a photo (for example: leak, panel, permit) | Agents can call this |
| [media.search](https://doingwork.work/docs/reference/media-search/) | Find photos across the shop that carry all the given tags | Agents can call this |
| [jobs.findByTag](https://doingwork.work/docs/reference/jobs-findbytag/) | Jobs in the shop that carry all the given tags (set with jobs.setTags), newest first, up to 200 | Agents can call this |
| [media.saveMarkup](https://doingwork.work/docs/reference/media-savemarkup/) | Save markup over a photo as a new layer version: arrows, lines, boxes, circles, text and freehand strokes in 0..1 photo coordinates (0,0 is top left) | Agents can call this |
| [media.getMarkup](https://doingwork.work/docs/reference/media-getmarkup/) | A photo's markup: the latest version unless one is named, with an SVG overlay to lay over the original photo | Agents can call this |
| [webhooks.deliveries](https://doingwork.work/docs/reference/webhooks-deliveries/) | List deliveries to one webhook endpoint, newest first, with event, status, attempts and last HTTP status | Agents can call this |
| [webhooks.retry](https://doingwork.work/docs/reference/webhooks-retry/) | Send a failed or dead delivery again from attempt 0 (owner or office) | Agents can call this |
| [shops.export](https://doingwork.work/docs/reference/shops-export/) | Owner only: everything the shop holds as one ZIP: data/<table>.csv and data/<table>.json for every shop table, files/ with job photos and PDFs, and manifest.json | Agents can call this |
| [members.permissions](https://doingwork.work/docs/reference/members-permissions/) | What each current worker in a shop may do beyond their role: see_prices, see_costs, take_money, delete and manage_schedule | Agents can call this |
| [members.setPermissions](https://doingwork.work/docs/reference/members-setpermissions/) | Owner only, not an agent: turn a worker's permissions on or off | A person's own sign-in only |
| [jobs.complete](https://doingwork.work/docs/reference/jobs-complete/) | Mark a job done (owner or office) | Agents can call this |
| [customers.audience](https://doingwork.work/docs/reference/customers-audience/) | Pick a customer audience by filters (tags, last job dates, kind of work, open quotes, money owed, maintenance plans, city or postal code, has email or phone) and get the counts and a page of matching customers | Agents can call this |
| [shops.transferStart](https://doingwork.work/docs/reference/shops-transferstart/) | Start handing the shop to a current worker (owner, on a hosted page) | Hosted page only |
| [shops.transferAccept](https://doingwork.work/docs/reference/shops-transferaccept/) | Accept a hand-off and become the shop's owner (the person asked, on a hosted page) | Hosted page only |
| [shops.transferCancel](https://doingwork.work/docs/reference/shops-transfercancel/) | Stop an open hand-off: the owner cancels it, or the person asked declines it | Agents can call this |
| [shops.transfers](https://doingwork.work/docs/reference/shops-transfers/) | Hand-offs of a shop, newest first | Agents can call this |
| [shops.closeCheck](https://doingwork.work/docs/reference/shops-closecheck/) | Whether the shop can close now (owner only) | Agents can call this |
| [shops.close](https://doingwork.work/docs/reference/shops-close/) | Close the shop for good (owner, on a hosted page, typing the shop name) | Hosted page only |
| [shops.reopen](https://doingwork.work/docs/reference/shops-reopen/) | Reopen a closed shop (only the owner who closed it, on a hosted page, within 90 days of closing) | Hosted page only |
| [invoices.void](https://doingwork.work/docs/reference/invoices-void/) | Void an invoice nobody has paid yet (owner or office), with a reason | Agents can call this |

## Team (unlimited workers)

| Operation | What it does | Who |
|---|---|---|
| [members.invite](https://doingwork.work/docs/reference/members-invite/) | Invite a person by email as office or field | Agents can call this |
| [members.accept](https://doingwork.work/docs/reference/members-accept/) | Accept an invite as the signed-in person | Agents can call this |
| [members.list](https://doingwork.work/docs/reference/members-list/) | Current members of a shop with role and start date | Agents can call this |
| [members.end](https://doingwork.work/docs/reference/members-end/) | End a membership: the owner removes a worker, or a worker leaves | Agents can call this |
| [members.changeRole](https://doingwork.work/docs/reference/members-changerole/) | Owner changes a worker between office and field | Agents can call this |
| [approvals.setRule](https://doingwork.work/docs/reference/approvals-setrule/) | Owner only, not an agent: require owner approval before an agent can run an action | A person's own sign-in only |
| [approvals.removeRule](https://doingwork.work/docs/reference/approvals-removerule/) | Owner only, not an agent: stop requiring approval for a rule | A person's own sign-in only |
| [approvals.listRules](https://doingwork.work/docs/reference/approvals-listrules/) | The shop's approval rules: which agent actions wait for the owner | Agents can call this |
| [approvals.list](https://doingwork.work/docs/reference/approvals-list/) | Approval requests for a shop, newest first, optionally by status (pending, approved, denied, failed, expired) | Agents can call this |
| [approvals.get](https://doingwork.work/docs/reference/approvals-get/) | One approval request with its status and, once approved and run, the action's result | Agents can call this |
| [approvals.decide](https://doingwork.work/docs/reference/approvals-decide/) | Owner only, not an agent: approve or deny a pending agent action | A person's own sign-in only |

## Customers

| Operation | What it does | Who |
|---|---|---|
| [customers.create](https://doingwork.work/docs/reference/customers-create/) | Add a customer to a shop, with kind, company, email, phone, billing address, lead source, tags and notes in one call | Agents can call this |
| [properties.add](https://doingwork.work/docs/reference/properties-add/) | Add a service address to a customer, with optional label and access notes | Agents can call this |
| [properties.list](https://doingwork.work/docs/reference/properties-list/) | Service addresses of a customer, or every property of a shop | Agents can call this |
| [properties.update](https://doingwork.work/docs/reference/properties-update/) | Change a property's label or access notes, or archive it | Agents can call this |
| [equipment.add](https://doingwork.work/docs/reference/equipment-add/) | Record equipment at a property: kind, make, model, serial, install date and warranty | Agents can call this |
| [equipment.list](https://doingwork.work/docs/reference/equipment-list/) | Equipment at a property, or warranties ending soon across a shop | Agents can call this |
| [equipment.update](https://doingwork.work/docs/reference/equipment-update/) | Change or archive an equipment record | Agents can call this |

## Jobs (unlimited)

| Operation | What it does | Who |
|---|---|---|
| [jobs.create](https://doingwork.work/docs/reference/jobs-create/) | Start a job at a home (the home is found or created from the address) | Agents can call this |
| [jobs.list](https://doingwork.work/docs/reference/jobs-list/) | Jobs of a shop, newest first | Agents can call this |
| [jobs.get](https://doingwork.work/docs/reference/jobs-get/) | One job with its home address | Agents can call this |

## Job photos

| Operation | What it does | Who |
|---|---|---|
| [media.requestUpload](https://doingwork.work/docs/reference/media-requestupload/) | Get a signed upload URL for a job photo | Agents can call this |
| [media.requestCapture](https://doingwork.work/docs/reference/media-requestcapture/) | Hosted photo capture: a signed upload URL for a worker taking a photo in the browser | Hosted page only |
| [media.list](https://doingwork.work/docs/reference/media-list/) | List the photos on a job that you are allowed to see | Agents can call this |
| [media.get](https://doingwork.work/docs/reference/media-get/) | One photo's details | Agents can call this |
| [shares.create](https://doingwork.work/docs/reference/shares-create/) | Make a link to a gallery of a job's photos that anyone with the link can open without signing in | Agents can call this |
| [shares.list](https://doingwork.work/docs/reference/shares-list/) | Photo share links on a job, newest first, with whether each is still active and how often it was opened | Agents can call this |
| [shares.revoke](https://doingwork.work/docs/reference/shares-revoke/) | Turn a photo share link off now | Agents can call this |

## Quotes (unlimited)

| Operation | What it does | Who |
|---|---|---|
| [quotes.create](https://doingwork.work/docs/reference/quotes-create/) | Create a quote from lines the worker wrote | Agents can call this |
| [quotes.send](https://doingwork.work/docs/reference/quotes-send/) | Lock the quote and get a single-use signing link for the customer | Agents can call this |
| [quotes.sign](https://doingwork.work/docs/reference/quotes-sign/) | Sign a quote after accepting electronic signing | Hosted page only |
| [quotes.revise](https://doingwork.work/docs/reference/quotes-revise/) | Replace an unsigned quote with a new version | Agents can call this |
| [pricebook.saveItem](https://doingwork.work/docs/reference/pricebook-saveitem/) | Add a price book item, or change one when item_id is given (owner or office) | Agents can call this |
| [pricebook.list](https://doingwork.work/docs/reference/pricebook-list/) | List the shop's price book items, by name | Agents can call this |
| [pricebook.archiveItem](https://doingwork.work/docs/reference/pricebook-archiveitem/) | Archive a price book item, or bring it back with archived false (owner or office) | Agents can call this |

## Invoices and payments (unlimited)

| Operation | What it does | Who |
|---|---|---|
| [invoices.createFromQuote](https://doingwork.work/docs/reference/invoices-createfromquote/) | Create an invoice for a signed quote, for the total of the option and optional lines the customer picked | Agents can call this |
| [invoices.send](https://doingwork.work/docs/reference/invoices-send/) | Send an invoice (or the next part of it) and get a single-use pay link | Agents can call this |
| [invoices.pay](https://doingwork.work/docs/reference/invoices-pay/) | Start paying an invoice (hosted page) | Hosted page only |
| [invoices.markPaidOutside](https://doingwork.work/docs/reference/invoices-markpaidoutside/) | Record that the customer paid an invoice outside Doing Work (check, cash, financing, insurance or other) | A person's own sign-in only |
| [invoices.refund](https://doingwork.work/docs/reference/invoices-refund/) | Refund part or all of a payment (owner or office) | A person's own sign-in only |
| [taxes.saveRate](https://doingwork.work/docs/reference/taxes-saverate/) | Add or change a sales tax rate the shop charges in one jurisdiction (owner or office) | Agents can call this |
| [taxes.listRates](https://doingwork.work/docs/reference/taxes-listrates/) | The shop's tax rates | Agents can call this |
| [taxes.archiveRate](https://doingwork.work/docs/reference/taxes-archiverate/) | Stop using a tax rate (owner or office) | Agents can call this |
| [taxes.salesReport](https://doingwork.work/docs/reference/taxes-salesreport/) | Sales tax report for a period (owner or office), shop local dates, from and to inclusive | Agents can call this |

## Stripe connection

| Operation | What it does | Who |
|---|---|---|
| [payments.connectStart](https://doingwork.work/docs/reference/payments-connectstart/) | Start payment setup for a shop (owner, hosted page) | Hosted page only |
| [cards.setupLink](https://doingwork.work/docs/reference/cards-setuplink/) | Get a secure page where the customer saves a card with the shop's payment processor (owner or office) | Agents can call this |
| [cards.resave](https://doingwork.work/docs/reference/cards-resave/) | Open the card saving page from a save-your-card-again email link (hosted page only) | Hosted page only |
| [cards.get](https://doingwork.work/docs/reference/cards-get/) | The card a customer has on file (brand, last 4, expiry) and whether auto-pay is on (owner or office) | Agents can call this |
| [cards.remove](https://doingwork.work/docs/reference/cards-remove/) | Remove a customer's saved card (owner or office) | Agents can call this |

## Idaho compliance

| Operation | What it does | Who |
|---|---|---|
| [subcontractors.get](https://doingwork.work/docs/reference/subcontractors-get/) | The Idaho 45-525(3) subcontractor and supplier statement for a job: the latest signed one, any prepared draft, and whether final payment needs one | Agents can call this |
| [subcontractors.prepare](https://doingwork.work/docs/reference/subcontractors-prepare/) | Prepare the Idaho 45-525(3) statement for the shop to sign: a list of subcontractors, materialmen and rental equipment providers over $500, or none_attestation "yes" for "No subcontractors or suppliers over $500 on this job" | Agents can call this |
| [subcontractors.sign](https://doingwork.work/docs/reference/subcontractors-sign/) | The shop owner or office signs the Idaho 45-525(3) statement on a hosted page: a list (entries JSON), the "No subcontractors or suppliers over $500 on this job" attestation (none_attestation "yes"), or with neither, the prepared draft | Hosted page only |

## Signed job records

| Operation | What it does | Who |
|---|---|---|
| [jobs.requestConfirmation](https://doingwork.work/docs/reference/jobs-requestconfirmation/) | Get a single-use link the customer opens to confirm the work was done (or flag a problem) | Agents can call this |
| [jobs.confirm](https://doingwork.work/docs/reference/jobs-confirm/) | Customer confirms the work or flags a problem (hosted page) | Hosted page only |
| [records.keys](https://doingwork.work/docs/reference/records-keys/) | Public keys that verify signed job records | Agents can call this |
| [jobs.record](https://doingwork.work/docs/reference/jobs-record/) | The latest signed record for a job and its level (logged, paid, verified) | Agents can call this |
| [documents.photoReport](https://doingwork.work/docs/reference/documents-photoreport/) | Render a photo report PDF for a job: a title and the worker's own notes, then the job's photos in time order with stage and tags | Agents can call this |
| [documents.dailyLog](https://doingwork.work/docs/reference/documents-dailylog/) | Render the daily log for a job as a PDF: each day's entries in the workers' own words with who wrote them, and the photos they attached | Agents can call this |
| [documents.list](https://doingwork.work/docs/reference/documents-list/) | PDF documents core made for a job (photo reports, daily logs and submitted forms), newest first, with each file's sha256 | Agents can call this |
| [documents.get](https://doingwork.work/docs/reference/documents-get/) | One stored job PDF (base64) with its sha256, byte for byte as it was made | Agents can call this |

## Plans and fees

| Operation | What it does | Who |
|---|---|---|
| [fees.statement](https://doingwork.work/docs/reference/fees-statement/) | A month's Doing Work fees for a shop: card and bank volume, fees by kind, the effective rate, each line, and how far the shop is from the next band this month (owner or office) | Agents can call this |

## Developers and platforms

| Operation | What it does | Who |
|---|---|---|
| [webhooks.create](https://doingwork.work/docs/reference/webhooks-create/) | Add a webhook endpoint for a shop (owner or office) | A person's own sign-in only |
| [webhooks.list](https://doingwork.work/docs/reference/webhooks-list/) | List a shop's webhook endpoints and their recent delivery counts | Agents can call this |
| [webhooks.delete](https://doingwork.work/docs/reference/webhooks-delete/) | Remove a webhook endpoint | Agents can call this |
| [platforms.create](https://doingwork.work/docs/reference/platforms-create/) | Create a developer platform account (private beta) | Agents can call this |
| [platforms.list](https://doingwork.work/docs/reference/platforms-list/) | List the platform accounts you own and the shops each one manages | Agents can call this |
| [platforms.grantManage](https://doingwork.work/docs/reference/platforms-grantmanage/) | Let a platform manage this shop | Hosted page only |
| [platforms.revokeManage](https://doingwork.work/docs/reference/platforms-revokemanage/) | Stop a platform from managing this shop | Agents can call this |
| [events.catalog](https://doingwork.work/docs/reference/events-catalog/) | Every event a webhook can receive, with its payload keys and types | Agents can call this |

## Scheduling and visits

| Operation | What it does | Who |
|---|---|---|
| [visits.createRecurring](https://doingwork.work/docs/reference/visits-createrecurring/) | Book a repeating visit (daily, weekly or monthly, every n) for a job | Agents can call this |
| [visits.cancelSeries](https://doingwork.work/docs/reference/visits-cancelseries/) | Cancel the visits of a repeating series that have not started yet, from a time onward (default now) | Agents can call this |
| [visits.start](https://doingwork.work/docs/reference/visits-start/) | Mark a visit started (from scheduled, on the way, or arrived) | Agents can call this |
| [visits.done](https://doingwork.work/docs/reference/visits-done/) | Mark a visit done, with an optional note | Agents can call this |
| [visits.create](https://doingwork.work/docs/reference/visits-create/) | Book a visit to a job at a time, optionally with the workers going | Agents can call this |
| [visits.update](https://doingwork.work/docs/reference/visits-update/) | Move a visit or change its title, notes or arrival window | Agents can call this |
| [visits.assign](https://doingwork.work/docs/reference/visits-assign/) | Set who is going on a visit | Agents can call this |
| [visits.cancel](https://doingwork.work/docs/reference/visits-cancel/) | Cancel a visit that is scheduled, on the way, or arrived | Agents can call this |
| [visits.get](https://doingwork.work/docs/reference/visits-get/) | One visit with its job and workers | Agents can call this |
| [schedule.list](https://doingwork.work/docs/reference/schedule-list/) | A shop's visits that overlap a time window, earliest first | Agents can call this |
| [availability.setHours](https://doingwork.work/docs/reference/availability-sethours/) | Set a worker's weekly hours, replacing what was there | Agents can call this |
| [availability.addTimeOff](https://doingwork.work/docs/reference/availability-addtimeoff/) | Add time off for a worker (vacation, sick, appointment) | Agents can call this |
| [availability.removeTimeOff](https://doingwork.work/docs/reference/availability-removetimeoff/) | Remove a time-off entry | Agents can call this |
| [availability.get](https://doingwork.work/docs/reference/availability-get/) | A worker's weekly hours, time off, and booked visits in a window (at most 62 days) | Agents can call this |
| [schedule.settings](https://doingwork.work/docs/reference/schedule-settings/) | The shop's scheduling setup: time zone, booking hours (or the default when none are set), arrival window, travel buffer, reminder lead time, and whether on-my-way notices go out | Agents can call this |
| [schedule.setShopHours](https://doingwork.work/docs/reference/schedule-setshophours/) | Set the shop's booking hours, replacing what was there (owner or office) | Agents can call this |
| [schedule.setRules](https://doingwork.work/docs/reference/schedule-setrules/) | Change the shop's scheduling rules (owner or office; the time zone is owner only) | Agents can call this |
| [schedule.findTime](https://doingwork.work/docs/reference/schedule-findtime/) | Find open times for a visit of a given length | Agents can call this |
| [visits.onTheWay](https://doingwork.work/docs/reference/visits-ontheway/) | Mark that the worker is on the way to a visit, with an optional ETA (eta_at, or eta_minutes from now) | Agents can call this |
| [visits.arrived](https://doingwork.work/docs/reference/visits-arrived/) | Mark that the worker arrived at a visit | Agents can call this |
| [visits.notices](https://doingwork.work/docs/reference/visits-notices/) | Customer notices planned or handled for a visit (appointment reminder, on my way), with status pending, queued (handed to email), cancelled or skipped and why | Agents can call this |
| [maintenance.createPlan](https://doingwork.work/docs/reference/maintenance-createplan/) | Start a maintenance plan for a job's customer (owner or office) | Agents can call this |
| [maintenance.getPlan](https://doingwork.work/docs/reference/maintenance-getplan/) | One maintenance plan: price per term, current term, renewal date, and each term's invoice | Agents can call this |
| [maintenance.listPlans](https://doingwork.work/docs/reference/maintenance-listplans/) | A shop's maintenance plans, optionally for one customer or by status, soonest renewal first | Agents can call this |
| [maintenance.setPrice](https://doingwork.work/docs/reference/maintenance-setprice/) | Replace a plan's priced lines (owner or office; you write them, never AI), and optionally its tax rate | Agents can call this |
| [maintenance.cancelPlan](https://doingwork.work/docs/reference/maintenance-cancelplan/) | Cancel a maintenance plan (owner or office) | Agents can call this |
| [visits.changeRequests](https://doingwork.work/docs/reference/visits-changerequests/) | Customers' requests to move or cancel a visit, from the customer hub, newest first | Agents can call this |
| [visits.answerChange](https://doingwork.work/docs/reference/visits-answerchange/) | Answer a customer's request to move or cancel a visit | Agents can call this |

## Field work (checklists, forms, time, notes, change orders, subcontractors)

| Operation | What it does | Who |
|---|---|---|
| [logs.add](https://doingwork.work/docs/reference/logs-add/) | Write a daily log entry on a job: what happened on site that day, in the worker's own words | Agents can call this |
| [logs.list](https://doingwork.work/docs/reference/logs-list/) | Daily log entries on a job, oldest first, optionally between two dates (inclusive) | Agents can call this |
| [logs.remove](https://doingwork.work/docs/reference/logs-remove/) | Take a daily log entry out of the log | Agents can call this |
| [signatures.request](https://doingwork.work/docs/reference/signatures-request/) | Ask someone to sign a document on a hosted page, and get the signing link to give them | Agents can call this |
| [signatures.newLink](https://doingwork.work/docs/reference/signatures-newlink/) | A new signing link for an open signature request | Agents can call this |
| [signatures.cancel](https://doingwork.work/docs/reference/signatures-cancel/) | Cancel an open signature request | Agents can call this |
| [signatures.get](https://doingwork.work/docs/reference/signatures-get/) | One signature request: the document text (or stored PDF id) and its sha256, and the signature when signed (who, typed name, consent text and its sha256, surface, time) | Agents can call this |
| [signatures.list](https://doingwork.work/docs/reference/signatures-list/) | Signature requests for a job, a customer or a whole shop, newest first, with status and who signed | Agents can call this |
| [signatures.sign](https://doingwork.work/docs/reference/signatures-sign/) | Sign a document after reading it, typing your name and agreeing to sign electronically | Hosted page only |
| [checklists.saveTemplate](https://doingwork.work/docs/reference/checklists-savetemplate/) | Create a checklist template, or replace one (give checklist_template_id) | Agents can call this |
| [checklists.listTemplates](https://doingwork.work/docs/reference/checklists-listtemplates/) | The shop's checklist templates with their items | Agents can call this |
| [checklists.archiveTemplate](https://doingwork.work/docs/reference/checklists-archivetemplate/) | Archive a checklist template so it is no longer offered | Agents can call this |
| [checklists.create](https://doingwork.work/docs/reference/checklists-create/) | Put a checklist on a job, or on one visit of the job (visit_id) | Agents can call this |
| [checklists.list](https://doingwork.work/docs/reference/checklists-list/) | Checklists on a job (all of them, job-level and per visit) or on one visit, with counts of open required items and sign-off state | Agents can call this |
| [checklists.get](https://doingwork.work/docs/reference/checklists-get/) | One checklist with every item (removed items included and marked), who ticked what and when, and its sign-off | Agents can call this |
| [checklists.checkItem](https://doingwork.work/docs/reference/checklists-checkitem/) | Tick (done true) or untick an item, with an optional note | Agents can call this |
| [checklists.addItems](https://doingwork.work/docs/reference/checklists-additems/) | Add items to the end of a checklist (owner or office) | Agents can call this |
| [checklists.removeItem](https://doingwork.work/docs/reference/checklists-removeitem/) | Remove an item from a checklist (it stays in the history, marked removed) | Agents can call this |
| [checklists.requestSignOff](https://doingwork.work/docs/reference/checklists-requestsignoff/) | Ask for a sign-off on a finished checklist and get the signing link | Agents can call this |
| [forms.saveTemplate](https://doingwork.work/docs/reference/forms-savetemplate/) | Create a form template (an inspection, a safety sheet, a start-up report), or replace one (give form_template_id) | Agents can call this |
| [forms.listTemplates](https://doingwork.work/docs/reference/forms-listtemplates/) | The shop's form templates with their fields | Agents can call this |
| [forms.archiveTemplate](https://doingwork.work/docs/reference/forms-archivetemplate/) | Archive a form template so it is no longer offered | Agents can call this |
| [forms.start](https://doingwork.work/docs/reference/forms-start/) | Start a form on a job, or on one visit of the job (visit_id) | Agents can call this |
| [forms.fill](https://doingwork.work/docs/reference/forms-fill/) | Save answers on a draft form | Agents can call this |
| [forms.submit](https://doingwork.work/docs/reference/forms-submit/) | Submit a draft form: every required field must be answered (forms.get lists what is missing) | Agents can call this |
| [forms.cancel](https://doingwork.work/docs/reference/forms-cancel/) | Cancel a draft form (kept in history) | Agents can call this |
| [forms.get](https://doingwork.work/docs/reference/forms-get/) | One form with its fields, answers, the required fields still missing, its stored PDF id and hash once submitted, and its sign-off | Agents can call this |
| [forms.list](https://doingwork.work/docs/reference/forms-list/) | Forms on a job (job-level and per visit), or on one visit, newest first, without fields and answers | Agents can call this |
| [forms.requestSignOff](https://doingwork.work/docs/reference/forms-requestsignoff/) | Ask for a signature on a submitted form and get the signing link (owner or office) | Agents can call this |
| [notes.add](https://doingwork.work/docs/reference/notes-add/) | Write a note on a job, or on one visit of it (give visit_id; job_id is then optional) | Agents can call this |
| [notes.addVoiceMemo](https://doingwork.work/docs/reference/notes-addvoicememo/) | Save a voice memo as a note: send the transcript your agent made, the memo's length in seconds, when it was recorded, and what transcribed it | Agents can call this |
| [notes.update](https://doingwork.work/docs/reference/notes-update/) | Change a note | Agents can call this |
| [notes.remove](https://doingwork.work/docs/reference/notes-remove/) | Take a note off the job | Agents can call this |
| [notes.get](https://doingwork.work/docs/reference/notes-get/) | One note you may see, with every earlier wording (history, oldest first) | Agents can call this |
| [notes.list](https://doingwork.work/docs/reference/notes-list/) | Notes you may see on a job (job-level and every visit) or on one visit: pinned first, then newest first | Agents can call this |
| [changes.create](https://doingwork.work/docs/reference/changes-create/) | Write a change order on a job: a priced change to its scope, from lines a worker wrote (never filled in by AI) | Agents can call this |
| [changes.list](https://doingwork.work/docs/reference/changes-list/) | A job's change orders and its money picture: signed quotes (contract_minor) + approved change orders = revised_total_minor; pending (sent, not yet signed); invoiced on live invoices; unbilled; and approved change orders not on an invoice yet | Agents can call this |
| [changes.get](https://doingwork.work/docs/reference/changes-get/) | One change order with its lines, totals, status, signature and invoice | Agents can call this |
| [changes.send](https://doingwork.work/docs/reference/changes-send/) | Owner or office: ask the customer to approve a change order | Agents can call this |
| [changes.cancel](https://doingwork.work/docs/reference/changes-cancel/) | Cancel a draft or sent change order (its open signature request is cancelled too, so the link stops working) | Agents can call this |
| [changes.invoice](https://doingwork.work/docs/reference/changes-invoice/) | Bill approved change orders on a normal invoice (draft; send it with invoices.send) | Agents can call this |
| [timesheets.clockIn](https://doingwork.work/docs/reference/timesheets-clockin/) | Start a person's clock: on a job (work), or drive, shop or break time | Agents can call this |
| [timesheets.clockOut](https://doingwork.work/docs/reference/timesheets-clockout/) | Stop a person's running clock | Agents can call this |
| [timesheets.current](https://doingwork.work/docs/reference/timesheets-current/) | A person's running clock in a shop, or null when they are not clocked in | Agents can call this |
| [timesheets.add](https://doingwork.work/docs/reference/timesheets-add/) | Add time after the fact (a manual entry with a start and an end, at most 24 hours) | Agents can call this |
| [timesheets.update](https://doingwork.work/docs/reference/timesheets-update/) | Fix a time entry that is not approved: its start, end, category, job, visit or notes | Agents can call this |
| [timesheets.void](https://doingwork.work/docs/reference/timesheets-void/) | Take back a time entry that was never approved (kept in history, no longer counted) | Agents can call this |
| [timesheets.decide](https://doingwork.work/docs/reference/timesheets-decide/) | Owner or office: approve or reject stopped time entries (up to 200 at once, one shop) | Agents can call this |
| [timesheets.reopen](https://doingwork.work/docs/reference/timesheets-reopen/) | Owner only: reopen approved time so it can be fixed (it goes back to waiting for approval) | Agents can call this |
| [timesheets.list](https://doingwork.work/docs/reference/timesheets-list/) | Time entries in a shop between dates (the shop's time zone), or on one job, with minutes by category and by person, and approved minutes | Agents can call this |
| [timesheets.setRate](https://doingwork.work/docs/reference/timesheets-setrate/) | Owner or office: set what an hour of a worker's time costs the shop (wage plus burden), or the shop default when person_id is left out | Agents can call this |
| [timesheets.listRates](https://doingwork.work/docs/reference/timesheets-listrates/) | Labor cost rates in force now: the shop default and each worker's own, plus upcoming ones | Agents can call this |
| [materials.add](https://doingwork.work/docs/reference/materials-add/) | Record a material used on a job (optionally on one of its visits): from the price book (pricebook_item_id; its name, unit, price, cost and taxable are copied as they are now) or typed in (name, unit, and optionally the price and cost per unit) | Agents can call this |
| [materials.update](https://doingwork.work/docs/reference/materials-update/) | Change a recorded material's quantity, visit or notes | Agents can call this |
| [materials.remove](https://doingwork.work/docs/reference/materials-remove/) | Remove a recorded material (recorded in error or returned) | Agents can call this |
| [materials.list](https://doingwork.work/docs/reference/materials-list/) | Materials recorded on a job (or one visit), with the price and cost totals of those still counted | Agents can call this |
| [subs.add](https://doingwork.work/docs/reference/subs-add/) | Add a subcontractor to a job: a company and the one email they will sign in with | Agents can call this |
| [subs.list](https://doingwork.work/docs/reference/subs-list/) | Subcontractors on a job, or on every job in the shop: status invited, joined, expired or removed, when they last opened their page | Agents can call this |
| [subs.update](https://doingwork.work/docs/reference/subs-update/) | Change a subcontractor's contact name, trade or scope note (what they see on their page) | Agents can call this |
| [subs.remove](https://doingwork.work/docs/reference/subs-remove/) | Take a subcontractor off a job, for good: their link stops working at once | Agents can call this |
| [subs.notes](https://doingwork.work/docs/reference/subs-notes/) | Notes subcontractors left on a job, newest first | Agents can call this |
| [subs.view](https://doingwork.work/docs/reference/subs-view/) | The subcontractor's page for one job: the shop, job summary, work address, scope note, upcoming visit times and their notes | Hosted page only |
| [subs.addNote](https://doingwork.work/docs/reference/subs-addnote/) | Leave a note for the shop on this job, as the subcontractor (up to 20 a day) | Hosted page only |

## Customer hub, requests and customer emails

| Operation | What it does | Who |
|---|---|---|
| [requests.create](https://doingwork.work/docs/reference/requests-create/) | Log a request for work from a customer or a new lead | Agents can call this |
| [requests.list](https://doingwork.work/docs/reference/requests-list/) | Requests of a shop, newest first, filtered by stage, customer or tag | Agents can call this |
| [requests.pipeline](https://doingwork.work/docs/reference/requests-pipeline/) | How many open requests a shop has in each stage, and how many were won or lost in the last 30 days | Agents can call this |
| [requests.get](https://doingwork.work/docs/reference/requests-get/) | One request with its customer and the job it became | Agents can call this |
| [requests.update](https://doingwork.work/docs/reference/requests-update/) | Move a request to another stage or change its details, customer or property | Agents can call this |
| [requests.convert](https://doingwork.work/docs/reference/requests-convert/) | Turn a request into a job at its property or address; the worker then writes the quote or books a visit | Agents can call this |
| [requests.formCreate](https://doingwork.work/docs/reference/requests-formcreate/) | Turn on the shop's public request form and get its key | Agents can call this |
| [requests.submitForm](https://doingwork.work/docs/reference/requests-submitform/) | Send a shop a request through its public form | Agents can call this |
| [templates.save](https://doingwork.work/docs/reference/templates-save/) | Save a quote template: worker-written lines (and good, better, best options) to start quotes from | Agents can call this |
| [templates.list](https://doingwork.work/docs/reference/templates-list/) | List the shop's saved quote templates with their lines | Agents can call this |
| [templates.archive](https://doingwork.work/docs/reference/templates-archive/) | Archive a quote template, or bring it back with archived false (owner or office) | Agents can call this |
| [messages.templates](https://doingwork.work/docs/reference/messages-templates/) | The shop's customer message templates, one per kind (invoice_reminder, quote_followup, review_request): the wording in use (custom or built-in), the placeholders each kind takes, and the locked link placeholder that must stay in the body | Agents can call this |
| [messages.saveTemplate](https://doingwork.work/docs/reference/messages-savetemplate/) | Set the subject and body wording for one kind of automatic customer email | Agents can call this |
| [messages.resetTemplate](https://doingwork.work/docs/reference/messages-resettemplate/) | Go back to the built-in wording for one kind of automatic customer email | Agents can call this |
| [messages.previewTemplate](https://doingwork.work/docs/reference/messages-previewtemplate/) | Show how one kind of automatic customer email reads, filled with sample customer details and the shop's name | Agents can call this |
| [hub.createLink](https://doingwork.work/docs/reference/hub-createlink/) | Make a customer hub link: one page where this customer sees their quotes, jobs, invoices, upcoming visits and requests with you, pays, asks to move or cancel a visit, and asks for new work | Agents can call this |
| [hub.links](https://doingwork.work/docs/reference/hub-links/) | A customer's hub links, newest first: when each was made, when it expires or was revoked, and how often and when it was last opened | Agents can call this |
| [hub.revokeLink](https://doingwork.work/docs/reference/hub-revokelink/) | Stop a customer hub link working, for good | Agents can call this |
| [hub.view](https://doingwork.work/docs/reference/hub-view/) | The customer hub for the signed-in customer: their quotes, jobs, invoices with what is still owed, upcoming visits with any change request, and requests with this shop | Hosted page only |
| [hub.open](https://doingwork.work/docs/reference/hub-open/) | Open a sent quote or an unpaid invoice from the customer hub: returns a fresh page link for that one item, for the signed-in customer only, good for a day | Hosted page only |
| [hub.requestVisitChange](https://doingwork.work/docs/reference/hub-requestvisitchange/) | From the customer hub, ask the shop to move (reschedule, with the times that work better) or cancel an upcoming visit | Hosted page only |
| [hub.withdrawVisitChange](https://doingwork.work/docs/reference/hub-withdrawvisitchange/) | From the customer hub, take back your own open request to move or cancel a visit | Hosted page only |
| [hub.requestWork](https://doingwork.work/docs/reference/hub-requestwork/) | From the customer hub, ask the shop for new work | Hosted page only |

## Costs, expenses and reports

| Operation | What it does | Who |
|---|---|---|
| [tips.report](https://doingwork.work/docs/reference/tips-report/) | Tips customers paid, by invoice and in total, between two dates (owner or office) | Agents can call this |
| [expenses.add](https://doingwork.work/docs/reference/expenses-add/) | Record money a worker spent on a job, with the receipt photo | Agents can call this |
| [expenses.update](https://doingwork.work/docs/reference/expenses-update/) | Change an expense: date, vendor, category, amount, tax, receipt photo or note | Agents can call this |
| [expenses.remove](https://doingwork.work/docs/reference/expenses-remove/) | Take an expense off the books (kept in history) | Agents can call this |
| [expenses.list](https://doingwork.work/docs/reference/expenses-list/) | Expenses on a job, or across the shop between dates, with totals by category | Agents can call this |
| [reports.revenue](https://doingwork.work/docs/reference/reports-revenue/) | Money collected between two dates (inclusive, UTC), by month: card and bank payments through Doing Work less refunds, and payments recorded as taken outside Doing Work, shown apart | Agents can call this |
| [reports.owed](https://doingwork.work/docs/reference/reports-owed/) | Money customers still owe on sent invoices, grouped by how long ago each invoice went out: 0 to 30, 31 to 60, 61 to 90 and over 90 days | Agents can call this |
| [reports.quoteWinRate](https://doingwork.work/docs/reference/reports-quotewinrate/) | Of the quotes made between two dates (inclusive, UTC) and sent, how many were signed, declined, or are still waiting | Agents can call this |
| [costs.job](https://doingwork.work/docs/reference/costs-job/) | Job costing for one job: contract, invoiced, collected and revenue against labor (approved and pending time at each entry's cost rate), materials at cost, expenses and Doing Work fees, with profit and margin | Agents can call this |
| [costs.jobs](https://doingwork.work/docs/reference/costs-jobs/) | Job costing across jobs dated between two days (inclusive, in the shop's time zone), with totals | Agents can call this |
| [reports.today](https://doingwork.work/docs/reference/reports-today/) | The shop's today queues in one call: visits today, visits in the next 7 days with nobody assigned, new requests, quotes and change orders waiting on the customer, overdue and draft invoices, done jobs not invoiced, time waiting for approval and approvals waiting on the owner | Agents can call this |
| [reports.week](https://doingwork.work/docs/reference/reports-week/) | How the shop did in one week (Monday to Sunday in the shop's time zone) against the week before: money collected, refunded, paid outside and invoiced; quotes sent and signed; jobs, visits, customers and requests; time logged and expenses | Agents can call this |
| [reports.save](https://doingwork.work/docs/reference/reports-save/) | Save a report to run again later: a name, one report operation (reports.revenue, reports.owed, reports.quoteWinRate, reports.today, reports.week, costs.jobs), its settings, and an optional moving date range (today, this_week, last_week, this_month, last_month, last_7_days, last_30_days, last_90_days, this_quarter, last_quarter, this_year, last_year) worked out on the shop's calendar each run | Agents can call this |
| [reports.listSaved](https://doingwork.work/docs/reference/reports-listsaved/) | The shop's saved reports, by name | Agents can call this |
| [reports.removeSaved](https://doingwork.work/docs/reference/reports-removesaved/) | Remove a saved report (kept for the record; its name is free to use again) | Agents can call this |
| [reports.run](https://doingwork.work/docs/reference/reports-run/) | Run a saved report now: its date range is worked out on the shop's calendar (or around as_of), and the report operation runs with the caller's own permissions | Agents can call this |

## Imports, custom fields, tags and search

| Operation | What it does | Who |
|---|---|---|
| [fields.define](https://doingwork.work/docs/reference/fields-define/) | Add a custom field to customers, properties, jobs, quotes or invoices for a shop | Agents can call this |
| [fields.list](https://doingwork.work/docs/reference/fields-list/) | Custom fields a shop has defined, optionally for one kind of record | Agents can call this |
| [fields.set](https://doingwork.work/docs/reference/fields-set/) | Set one custom field value on a customer, property, job, quote or invoice | Agents can call this |
| [fields.get](https://doingwork.work/docs/reference/fields-get/) | Custom field values on one record, with any required fields still empty | Agents can call this |
| [tags.list](https://doingwork.work/docs/reference/tags-list/) | Every tag used in the shop, with how many photos and jobs carry it | Agents can call this |
| [search.global](https://doingwork.work/docs/reference/search-global/) | Search one shop for customers (name, email, phone), properties (address), jobs (summary) and requests (title) | Agents can call this |
| [imports.fields](https://doingwork.work/docs/reference/imports-fields/) | The customer import fields and the built-in presets (jobber, housecall_pro, companycam) with the export column each reads | Agents can call this |
| [imports.preview](https://doingwork.work/docs/reference/imports-preview/) | Dry run of a customer CSV import | Agents can call this |
| [imports.run](https://doingwork.work/docs/reference/imports-run/) | Owner only: import customers (and one service address each) from a CSV with the mapping the owner confirmed | Agents can call this |
| [bulk.run](https://doingwork.work/docs/reference/bulk-run/) | Run one safe action on up to 200 records: customers.addTags, customers.removeTags, customers.archive, customers.unarchive, jobs.addTags, jobs.removeTags, visits.assign | Agents can call this |
