Hodos

Connect AI and other apps to Hodos

There are two ways in. People who use ChatGPT, Claude or another AI assistant add the Hodos connector and sign in as themselves. Programs your company runs use the REST API with a key an admin creates.

An AI assistant reaches Hodos through the connector, signed in as one person. Your own program reaches Hodos through the REST API, with a company key. Both land on the same Hodos records.
AI assistantChatGPT, Claude, Claude Code
Hodos connectorSigns in as you. Sees what you see.
Your programScripts and other systems
REST APICompany key. Only the scopes you pick.
Your company in HodosJobs, contacts, tasks, appointments, claims, files, invoices

Connect an AI assistant

The connector works with any assistant that supports MCP, the standard way AI apps plug into other software. Everyone connects with their own Hodos login, so a rep sees only what a rep sees in the app and an admin sees what an admin sees.

Connector addresshttps://hodos.strutq.com/api/mcp

Claude

  1. Open Settings, then Connectors, and choose Add custom connector.
  2. Name it Hodos and paste https://hodos.strutq.com/api/mcp as the address.
  3. Choose Connect. Hodos opens: sign in with your Hodos email and password and choose Allow.
  4. Start a new chat and ask about your jobs. Hodos is on by default, and the tools menu turns it off for a chat.

ChatGPT

  1. Open Settings, then Apps and Connectors, and turn on Developer mode under Advanced settings.
  2. Choose Create, name it Hodos, and paste https://hodos.strutq.com/api/mcp as the server address with OAuth sign-in.
  3. Sign in with your Hodos email and password and choose Allow.
  4. In a new chat, pick Hodos from the tools menu.

Claude Code and other MCP clients

  1. Add a remote HTTP server at https://hodos.strutq.com/api/mcp. In Claude Code, run the command below.
  2. The client finds the sign-in page on its own from the server's 401 answer and opens it in your browser.
Claude Code
claude mcp add --transport http hodos https://hodos.strutq.com/api/mcp

Things to ask

  • Using Hodos, what are my tasks and appointments this week?
  • Using Hodos, book an inspection on the Smith job for Tuesday at 10 AM.
  • Using Hodos, move the Smith job to the next stage.
  • Using Hodos, add a note to the Smith job that the adjuster approved the claim.
  • Using Hodos, add Jane Smith as a contact on the Smith job.

Send your team the setup

Message for your team
You can now use Claude or ChatGPT with Hodos. It works as you, sees only what you can see in Hodos, and asks before it changes anything.

Set it up once, about a minute:
1. In Claude, open Settings, then Connectors, and choose Add custom connector. In ChatGPT, open Settings, then Apps and Connectors, turn on Developer mode, and choose Create.
2. Name it Hodos and paste this address: https://hodos.strutq.com/api/mcp
3. Choose Connect, sign in with your Hodos email and password, and choose Allow.

Then just ask, for example:
"Using Hodos, what are my tasks and appointments this week?"
"Using Hodos, book an inspection on the Smith job for Tuesday at 10 AM."
"Using Hodos, move the Smith job to the next stage."

It can email or text a customer only after you approve the exact message and recipient. It never calls a customer; calls still go out from the Hodos inbox.

Menu names in ChatGPT and Claude change from time to time. If a step does not match, look for custom connectors or developer mode in that app's settings.

What the assistant can do

69 ways to look things up and 132 ways to change records. The full wording each assistant reads is in /llms.txt. A good assistant asks before it changes anything. Moving a stage, booking an appointment or creating a job runs your company's own Hodos automations, the same as doing it in the app.

Look things up

  • Read the Hodos agent rulesread_hodos_rules

    Your company's rules for how an agent works in Hodos: how to write notes, tasks, job updates, emails, and texts.

  • Search contactssearch_contacts

    Find people in the CRM by name, phone, or email.

  • Search jobssearch_jobs

    Find jobs by name, pipeline stage group, ownership, or outcome (open by default; won, lost and cancelled jobs are reachable with outcome).

  • Get job detailget_job

    One job in full: stage and how long it has been there, the customer, the insurance claim if there is one, open tasks, and the checklist of what this stage still needs before the job can move forward.

  • List my taskslist_my_tasks

    Tasks assigned to the signed-in rep that are due today or overdue, or due within the next seven days.

  • List my appointmentslist_my_appointments

    Appointments booked for the signed-in rep today, or across the next seven days.

  • Pipeline summarypipeline_summary

    How many open jobs sit in each pipeline stage and what they are worth in total.

  • Find documentsfind_documents

    The paperwork filed on one job or one contact, with each document's plain-language summary and the kind it is filed under.

  • Read job notesread_job_notes

    Everything said about one job, newest first: the notes people wrote (a reply names the note it answers in replyTo), the homeowner's own messages already on the record, and logged calls, alongside what happened to the job.

  • Get contact detailget_contact

    One contact in full: phone, email, address, and the jobs they are on (as the main customer or in another role).

  • List pipelines and stageslist_pipelines

    Every pipeline (workflow) in the company and its stages in order, with the ids change_job_stage and create_job need.

  • List teammateslist_team

    The active people in the company with their role, so a task or appointment can name who it is for.

  • List taskslist_tasks

    Tasks across the company that the rep can see, filtered by job, contact, who they are assigned to, and whether they are open or done.

  • Find insurance claimsfind_claims

    Insurance claims by claim number or carrier, with the job each belongs to.

  • List a job's fileslist_job_files

    Every file on one job, photos included, with name, folder, kind, size, and contentSha256 (the stored bytes' fingerprint, when Hodos has one; the same value means an exact copy).

  • Get a file download linkget_file_link

    A private download link for one file, good for 10 minutes.

  • List invoiceslist_invoices

    Invoices on one job, or the company's open invoices when no job is named: number, status, total, what is still owed, and due date.

  • List payments on a joblist_payments

    Money received on one job, newest first: amount, what it was for (deductible, ACV check, supplement and so on), how it was paid, the date, the receipt and check numbers, and the invoice it went to.

  • List contracts on a joblist_contracts

    The contracts and agreements on one job, newest first: what kind each is, where it stands (draft, waiting on the rep, waiting on the homeowner, partly signed, completed, voided or replaced), and who has signed and when.

  • Get roof measurementsget_measurements

    The roof measurements on one job, one per roof: squares, roof area, pitch, waste, and the ridge, hip, valley, eave, rake and flashing lengths, with where they came from (EagleView, Hover, GAF, manual and others) and whether the report is ready.

  • See how a job pays outget_job_payout

    How one job's profit is split: the overhead percent taken off the contract first, then each person's percent of the profit that is left.

  • See a job's estimates, invoice lines, supplements, and costsget_job_money

    The ids and amounts the money write tools need for one job: its estimates with their lines, the lines on its invoices, its supplements, its cost entries and budget lines, and its open online-payment flags for the office.

  • See which payment types a job can recordlist_payment_types

    The payment types record_payment accepts for one job, the same list as Log payment on the job.

  • Get one taskget_task

    One task by its exact id (from list_tasks or list_my_tasks), as Hodos holds it now: title, job or contact it is on, whether it is done, when it was finished and by whom, and when it last changed.

  • Read what a customer wroteread_conversation

    The newest email and text messages with one customer, both directions, so you can see how they replied.

  • List callslist_calls

    Recent calls the rep can see, newest first: who, when, direction, outcome, length, and the AI call summary when there is one.

  • List the rep's notificationslist_notifications

    What is in the rep's bell right now: new tasks and jobs assigned to them, mentions, and customer texts and emails waiting on them, newest first, with unread flagged.

  • List the kinds of record Hodos holdslist_record_types

    Every kind of record you can read with read_records, grouped (jobs, contacts, money, claims, documents and photos, messages and calls, calendar and tasks, company setup, storms and canvassing, activity), each with what it holds and the columns that usually narrow it.

  • Read records of any kindread_records

    Read one kind of record from Hodos (see list_record_types), newest first, with filters and paging: for example type files with a job_id filter, or type invoices with status eq open.

  • Job briefjob_brief

    Read a compact job brief from the screens the signed-in person can see.

  • My daymy_day

    Read the signed-in person's due tasks, appointments, customer replies waiting, and unread notification bell count.

  • Find recordsfind

    Search visible jobs, contacts, addresses, and claim numbers in one read-only request.

  • Get job insuranceget_job_insurance

    Read the canonical claim and evidence for an insurance job.

  • Get money overviewget_money_overview

    Read a bounded canonical personal or company money view.

  • List inboxlist_inbox

    List bounded inbox threads, or read one thread's bounded message history, without changing read state.

  • Get job timelineget_job_timeline

    Read one canonical page of visible job activity.

  • Get job estimatesget_job_estimates

    Read canonical saved estimate headers and one selected version.

  • List job paperworklist_job_paperwork

    Read a bounded canonical page of job paperwork.

  • Get homeget_home

    Read the same canonical home sections visible to the caller.

  • Read company settingsread_company_settings

    Read one canonical company settings catalog without running settings actions.

  • Get contact relationshipsget_contact_relationships

    Read the canonical visible people and projects related to one person or project.

  • Get contact referralsget_contact_referrals

    Read a visible contact's referred jobs.

  • Get production work orderget_production_work_order

    Read one canonical visible production work order without exposing production actions.

  • Get job contactsget_job_contacts

    Read the same active contact relationships visible on a staging project.

  • List projects moneylist_projects_money

    Read a bounded page of the canonical staging Money projection for the caller's role.

  • List productionlist_production

    Read a bounded page of visible staging production work orders and their materials.

  • Read job team chatread_job_team_chat

    Read the canonical bounded internal team chat without changing message read state.

  • See a job's folders, current scope and share linksget_job_folders

    One job's file setup: the company's Documents folder layout, folders the team made on this job, its photo folders with the photo ids in each, which file is the current scope of loss, and the share links still open (ids for turn_off_share_link).

  • Find copies of a file on a jobfind_duplicate_files

    Which files on a job are byte-for-byte the same file, by the contentSha256 list_job_files gives, the same check the app runs before an upload.

  • See which of a job's files came by emaillist_job_email_files

    Which of a job's files arrived on, or went out with, an email filed to the job, and (for admins) the PDFs on those emails not added to the job yet, with whether someone chose Don't add.

  • Read a contract draft's questions and answersget_contract_draft

    The questions a draft contract or agreement asks, by step, and the answers filled in so far, with the revision edit_contract_draft needs.

  • See a job's open signing linkslist_signing_links

    Who on a job's paperwork is still waiting to sign, and when each signing link expires, the same as the paperwork hub's waiting list.

  • Read a payment's receipt and void stateget_payment_details

    One recorded payment's receipt (number, amount, method, who paid) and whether it can be voided or already was, the same as its receipt and Void button.

  • Read an invoice's payment scheduleget_invoice_payment_schedule

    The scheduled payments on one invoice and which are paid, the same as the invoice's schedule.

  • See where a job came fromget_job_origin

    Where a job came from (door knock, call, referral, import and so on), the same as the job's origin line.

  • Look up a door on the mapfind_property

    One property (door) on the map, by id or by the point nearest a latitude and longitude, with its recent knocks and notes and the company's door statuses.

  • List the doors knocked in a date rangelist_knocked_doors

    The doors knocked between two dates, for every rep or one, the same as the map's Knocked filter.

  • Read storms, hail reports and storm marginget_storm_info

    Storm reads beside hail_at_address: the storm history and active warnings at a point, the live hail reports since a date, the storm margin areas for one storm, or the hail photos inside a map box.

  • See where the team isget_team_locations

    Admins only, as on the map's Team layer: each active rep's latest location, or one rep's trail.

  • Read trash, record numbers, access profiles and connectionsget_settings_info

    Read-only admin views: the trash (deleted jobs and contacts that can be restored), the record number counters, the access profiles and their permissions, which outside connections are set up, and whether the old-data path is ready.

  • Read email recipients, a job's email activity, drafts, or search sendersget_email_details

    Read-only.

  • Read leaderboards, call reports and appointment historyget_reports

    Read-only.

  • Read my crew's work ordersmy_crew_work

    For a crew member: the work orders and jobs their crew is on, 50 to a page, or one work order's instructions, checklist and photos, the same as the crew's work list in the app.

  • Read the text inside a fileread_file_text

    The written text of one PDF, Word (.docx) or text file on a job or contact, read page by page: use it to answer from the real estimate, scope, report or letter instead of its summary.

  • Download a file's bytes in piecesdownload_file_chunk

    The stored bytes of any file on a job or contact, up to 1 MiB per call as base64 in contentBase64, so a file of any type or size (photos including HEIC, PDFs, Word and spreadsheets, video) can be fetched and put back together.

  • Look at a photoview_file_image

    Returns one photo from a job as an image you can look at, shrunk to fit (long edge 1,568 pixels by default, up to 2,048) so large originals work.

  • Check hail at an addresshail_at_address

    Read Hodos storm history for a job address or a typed US street address.

  • Preview an email to a customerpreview_email

    Get the exact saved address, subject, and body a send_email would use, without sending anything.

  • Preview a text to a customerpreview_text

    Get the exact text and phone number a send_text would use, without sending anything.

Change records

  • Add an internal job noteadd_job_note

    Write one internal note onto a job's timeline.

  • Edit a note you wroteedit_note

    Replace the words of a note the signed-in rep wrote, using a note id from read_job_notes.

  • Delete a note you wrotedelete_note

    Delete one note the signed-in rep wrote, using a note id from read_job_notes.

  • Post in a job's team chatpost_job_team_chat

    Post one message in a job's team chat, the team-only conversation on the job (read it with read_job_team_chat).

  • Start or add to a team chatstart_team_chat

    Open a direct team chat with teammates (ids from list_team), the same as starting a chat in the Inbox, or add people to an existing team chat by passing its thread_id.

  • Post in a team chatpost_team_chat_message

    Post one message in an internal team chat in the Inbox, using a thread id from list_inbox or start_team_chat.

  • Set a job's main contactset_job_primary_contact

    Make one contact the job's main contact, the same as choosing the client on the job page.

  • Delete a job or contact (to Trash)move_to_trash

    Move a job or contact to Trash, the same as Delete on the record in the app.

  • Bring back a deleted job or contactrestore_from_trash

    Restore a job or contact from Trash, the same as Restore in Settings, Trash.

  • Archive or unarchive a jobarchive_job

    Archive a job off the board, or bring an archived one back with restore true, the same as Archive project on the board.

  • File a call on a joblink_call_to_job

    File one call (ids from list_calls) on a job, move it to another job, or take it off its job with job_id null, the same as the job picker on a call.

  • Fill in a custom fieldset_custom_field

    Set one of the company's custom fields on a job or contact, the same as editing it in the record's details.

  • Edit a job's detailsupdate_job

    Change details on one job the rep can see: its name, street address, city, state, ZIP, priority, value in dollars, date of loss, description, trades, lead source, start and end dates, referrer, and tags.

  • Edit a job's insurance claimupdate_job_claim

    Set or fix insurance claim details on a visible job.

  • Edit a contact's detailsupdate_contact

    Change details on one contact the rep can see: person/company kind, first and last name, display name, phone (a US number), email, street address, city, state, ZIP, tags, lead source, source detail, and referral partner status.

  • Finish, edit, reassign, or archive a taskupdate_task

    Work on one existing task (ids from list_tasks or list_my_tasks).

  • Reschedule, reassign, edit, or cancel an appointmentupdate_appointment

    Change one existing appointment (ids from list_my_appointments or get_job).

  • Create a taskcreate_task

    Create one task, assigned to the signed-in rep unless assignee_ids names teammates (ids from list_team), optionally attached to a job or a contact.

  • Log an activitylog_activity

    Record that something already happened on a job: a site visit, a call that took place outside Hodos, an adjuster meeting.

  • Archive photos and documentsarchive_files

    Move up to 50 of a job's photos, videos, or documents into its Archived folder, the same as Archive in the app.

  • Restore archived photos and documentsrestore_files

    Move up to 50 archived photos, videos, or documents back out of Archived, the same as Move out of Archived in the app.

  • Move documents to a foldermove_files

    Move up to 50 of a job's documents into one of its folders, the same as Move to in the app.

  • Add an internal contact noteadd_contact_note

    Write one internal note onto a contact's timeline, for a person with no job yet or a fact about the person rather than a job.

  • Book an appointmentbook_appointment

    Put an appointment on the Hodos calendar for a job, a contact, or a personal Meeting with no client.

  • Move a job to another stagechange_job_stage

    Move a job to a different stage, in its own pipeline or in another one (the app's Move to pipeline).

  • Add a contactcreate_contact

    Add a new person to Hodos.

  • Create a jobcreate_job

    Open a new job for an existing contact in one of the company's pipelines.

  • Add a person to a jobadd_contact_to_job

    Put another person on a job, such as a spouse, tenant, adjuster, or insurance agent, with their role.

  • Create an invoicecreate_invoice

    Create a one-line invoice on a job that has none yet.

  • Add a charge to an invoiceadd_invoice_charge

    Add a line to a job's contract invoice: a charge on a retail job, or a supplement on an insurance job.

  • Record a payment receivedrecord_payment

    Record money a job has already received, the same as Log payment on the job in the app.

  • Set how a job pays outset_job_payout

    Set one job's payout split by hand, the same as the Payout editor on the job.

  • Assign people to a jobassign_job_people

    Change who is on a job's team, the same as the Team block on the job.

  • Start a draft estimatecreate_estimate

    Start a blank draft estimate on a job, the same as New estimate on the job.

  • Edit an estimate's linesupdate_estimate_lines

    Add, change, or remove lines on a draft estimate in one step, the same edits the estimate screen makes.

  • Mark an estimate declineddecline_estimate

    Record that the customer turned an estimate down, the same as Decline on the estimate.

  • Delete a draft estimatedelete_draft_estimate

    Delete an estimate that was never sent, the same as Delete draft on the estimate.

  • Remove an added charge from an invoiceremove_invoice_charge

    Take a charge or supplement line that was added to a job's contract invoice back off, the same as Remove on that line.

  • Apply a recorded payment to an invoiceapply_payment_to_invoice

    Count a payment the company already recorded (see list_payments) toward an invoice, the same as Apply payment on the invoice.

  • Give an invoice a creditadd_invoice_credit

    Admins only.

  • Add a cost to a jobadd_job_cost

    Add a cost the company paid on a job, the same as Add cost on the job's money tab.

  • Remove a cost from a jobremove_job_cost

    Delete a cost entry from a job, the same as Remove on the cost.

  • Update a supplement's statusupdate_supplement

    Move a supplement through its stages on the job: draft, submitted, approved, partial, or denied, the same as the supplement screen.

  • Change a payment's noteset_payment_note

    Write or clear the note on a recorded payment, the same as the note on its receipt.

  • Void a recorded paymentvoid_payment

    Void a payment someone logged by hand (check, cash and the like) with a reason, the same as Void on the payment.

  • Bill a side jobcreate_side_job_invoice

    Start a separate bill on a job for extra work outside the contract, the same as Side Job on Make Payment Link.

  • Turn a signed estimate into an invoiceconvert_estimate_to_invoice

    Make the invoice for an estimate the customer already signed, the same as Create invoice on that estimate.

  • Edit the lines of a draft invoiceedit_invoice_lines

    Add, change or remove lines on a draft invoice the rep made by hand, the same as the Items list on that invoice.

  • Add a budget line to a jobadd_budget_line

    Plan what a job should cost, one line at a time, the same as Add budget line on the Budget screen.

  • Mark a job cost paid or unpaidmark_job_cost_paid

    Record that the company paid a cost on a job, or take that back with a reason, the same as Paid on the cost.

  • Mark a job's costs completeset_job_costs_complete

    Say every cost on a job is in, or open it back up, the same as Costs complete on the job's money tab.

  • Mark a payout paid or unpaidmark_payout_paid

    Admins only.

  • Mark an online payment flag handledresolve_payment_flag

    Clear a flag an online payment raised for the office (for example money that could not be matched), the same as Handled on the flag.

  • Undo a supplement approval read from an emailundo_supplement_email_approval

    Take back a supplement approval Hodos filed from a carrier's email, the same as Undo on that approval card.

  • Void a contractvoid_contract

    Void a job's contract with a reason, the same as Void on the contract.

  • Tell the office what you could not doreport_gap

    Use this when the rep asks for something this connector cannot do, or a tool fails in a way the rep cannot fix.

  • Mark a task done or not doneset_task_done

    Set one task (exact id from list_tasks, list_my_tasks, or get_task) to done true or done false.

  • Skip or bring back an emailed PDFset_email_pdf_dismissed

    Don't add, or Bring back, a PDF from an email filed to the job, the same as on the job's Documents.

  • Make, rename or remove a job's document folderedit_document_folder

    Make a new folder on a job's Documents, rename one the team made, or remove one, the same as the folder menu in the app.

  • Put documents in a made folderput_files_in_folder

    Put up to 50 of a job's documents in a folder the team made, or take them out of it with folder_id left out, the same as dragging a file in or out of that folder in the app.

  • Make, rename or remove a job's photo folderedit_photo_folder

    Make a new photo folder on a job, rename one, or remove one, the same as the folder menu on the job's Photos.

  • Move photos into or out of a photo foldermove_photos_to_folder

    Put up to 50 of a job's photos in one of its photo folders, or take them out of every folder with folder_id left out, the same as Move to folder on the job's Photos.

  • File a photo under an inspection shotrefile_inspection_photo

    File one of a job's photos under a shot of its inspection, or back to Unsorted with shot_id left out, the same as Move to on the job's Photos.

  • Make a file the current scope of lossmake_current_scope

    Mark one of a job's files as the current scope of loss, the same as Make current SOL on its Documents.

  • Delete a job's photos, videos or documentsdelete_files

    Admins only, as in the app: reps archive with archive_files instead.

  • Make a private share linkmake_share_link

    Make a private link the rep can copy and send themselves, the same as Share in the app: job_page opens the job's page for a homeowner or a sub (ends in 7, 14 or 30 days), document opens one file (14 days), photos opens chosen photos or all of the job's photos (30 days), photo_folder opens one photo folder as an album (7, 30 or 90 days, or never).

  • Turn off a share linkturn_off_share_link

    Stop a share link from opening, the same as Revoke in the app.

  • Start a material ordercreate_material_order

    Start a draft material order on a job, the same as New material order: empty, with lines, from a signed estimate, or for one trade's work order (work_order_id).

  • Edit a draft material orderedit_material_order

    Change a draft material order's delivery date or notes, and add, change or remove its lines, the same as the order's editor.

  • Move a material order to its next statusmove_material_order

    Move a material order one step: draft to submitted, submitted to confirmed, confirmed to delivered, the same as the order's status button.

  • Hand a material order to a trade's work orderlink_material_order_to_work_order

    Tie a material order already on the job to one trade's work order, or take it off with work_order_id left out, the same as using a spare order for a trade on the Production tab.

  • Turn a signed estimate into a work ordercreate_work_order

    Make the work order for a signed estimate, the same as Create work order in the production handoff.

  • Tick a work order checklist item or answer its formupdate_work_order_checklist

    On a work order: attach a photo to a checklist item (which marks it done) or take it off, or answer one question on one of its forms, the same as the work order page.

  • Choose which trades on a carrier scope the contract coversset_scope_trades

    Take trades of the carrier's scope of loss off the contract, or put them back, the same as the trade ticks on the scope card.

  • Add a crew or change who is on itmanage_crew

    Admins only, as in the app.

  • Record a crew's insurance policyset_crew_insurance

    Admins only.

  • Add a subcontractorcreate_subcontractor

    Admins only.

  • Change a subcontractor's details or paperworkedit_subcontractor

    Admins only.

  • Start a job's estimatestart_estimate

    Start an empty estimate on a job, retail or insurance, the same as Start estimate on the job.

  • Go back to an earlier estimate versionrestore_estimate_version

    Make an earlier version of an estimate the newest one again, the same as Restore in the estimate's versions list.

  • Make a proposal linkmake_proposal_link

    Make the homeowner's link to an estimate's proposal, the same as Copy link in the estimate editor.

  • Start a contract or agreement draftcreate_contract_draft

    Start a draft contract or other agreement on a job, the same as New contract, or the contract for a retail estimate the homeowner accepted (estimate_id).

  • Fill in a contract draftedit_contract_draft

    Set answers on a draft contract or agreement, by the field ids get_contract_draft lists, the same as typing them in the contract editor.

  • Replace a contract with a new draftreplace_contract

    Replace a contract that is out for signing with a fresh draft carrying the same answers, the same as Replace on its signing review.

  • Edit a draft supplementedit_supplement

    Change one line of a draft supplement (quantity, price, reason, or whether it is included) or its letter, the same as the supplement panel.

  • Add or change a supplement ruleedit_supplement_rule

    Admins only.

  • Save a custom contract section for the companysave_contract_section

    Put a custom contract section on the company's saved list, or refresh the wording of the one saved under that title, the same as Save for company in the contract editor.

  • Track a claim's checks and mortgageupdate_claim_money

    On a job's claim money card: say whether the claim has a mortgage company, when depreciation was requested, and add, change or remove a carrier check still coming or paid to the homeowner.

  • Undo a stage move a carrier scope email madeundo_scope_email_stage_move

    Put a job back where it was after Hodos moved it on its own because a carrier scope arrived by email, the same as Undo on that line of the job's history.

  • Reset a job's payout or set the value it pays onchange_job_payout

    Admins only, as in the app.

  • Approve or reject a bill's costsreview_cost_document

    Approve a bill or receipt filed on a job and post its cost lines, or reject it, the same as Review on the job's costs.

  • Start a guided inspectionstart_inspection

    Start a guided inspection on a job (quick_inspect or roof_claim), the same as Start inspection on the job.

  • Skip a section of an inspectionskip_inspection_section

    Mark one section of an open guided inspection as skipped, with the reason the office sees, the same as Skip on the phone.

  • Finish a guided inspectioncomplete_inspection

    Finish an open guided inspection, the same as Finish in the inspection.

  • Type in a roof's measurementssave_roof_measurements

    Set a roof's measurements by hand, the same as the manual measurements editor: squares, eave, ridge, valley, rake and hip linear feet, and waste percent.

  • Drop a door pin on the mapdrop_map_pin

    Put a new door on the map at a point, the same as dropping a pin.

  • Edit a door's homeowner or addressedit_property

    Change a door's homeowner name, phone or email, the same as the door's details.

  • Archive or delete a doorremove_property

    Archive a door so it leaves the map for everyone (restorable from Leads, Archived), or, admins only, delete doors that have no knocks or linked records, the same as in the app.

  • Log a door knock or a door notelog_door_knock

    Record a knock at a door with its status (ids from find_property statuses) and an optional note, or add a note alone, the same as the door panel.

  • Book an inspection from a doorbook_door_inspection

    Book an inspection at a door, the same as Book on the phone's door sheet: it adds the homeowner as a contact, opens a job (or uses existing_job_id), and books the appointment.

  • Set a follow-up at a doorrecord_door_follow_up

    Save the homeowner at a door and when to come back, the same as Follow up on the phone's door sheet.

  • Open a job from a door or an addressdoor_job

    Make a job from a door (property_id), the same as Convert to job on the map, or from a typed address, the same as Create job on an address's hail panel; or put an existing job on a door (link_job_id); or start a door inspection, which opens the job and its inspection together.

  • Draw, rename, assign or delete a territoryedit_territory

    Admins only, as in the app.

  • Watch an address, or stop watchingwatch_address

    Put a door, or a job's or contact's address, on the rep's watchlist with a reason and when to revisit (after the next storm, 30 or 90 days), the same as Watch; or stop a watch.

  • Refresh a storm alert, or delete a hail photoupdate_storm_alert_or_hail_photo

    Recount a storm alert's doors and jobs, the same as Refresh on the alert; or delete a hail photo pin the rep took (admins can delete any), the same as Delete on the photo.

  • Change pipelines and their stagesedit_pipeline_settings

    Admins only.

  • Add, change, reorder or delete a door statusedit_door_status

    Admins only.

  • List the company's inspection checklistslist_inspection_checklists

    Admins only.

  • Change an inspection checklistedit_inspection_checklist

    Admins only.

  • Change the roof claim photo checklistedit_photo_checklist

    Admins only.

  • Add, change or remove an estimate template lineedit_estimate_template_line

    Admins only.

  • Start, change, end or delete a competitionedit_competition

    Admins only.

  • Review and publish contract wording and the company profilemanage_contract_publication

    Admins only, from Settings, Contract templates.

  • Draft an automation or test it on a jobedit_automation

    Admins only.

  • Change or remove the company logoset_company_logo

    Admins only.

  • Remove an imported batch of doorsdelete_import_batch

    Admins only.

  • Pin or unpin a message in a conversationpin_message

    Pin one message to the top of a conversation, or unpin it (message_id null), the same as Pin in the inbox.

  • See, clear or put back Needs Replyneeds_reply

    list shows who is waiting on a reply; done takes one off Needs Reply without answering, the same as Done in the inbox; restore puts it back.

  • Stop a text that has not gone outcancel_unsent_text

    Cancel a text still waiting to send (for example held for quiet hours), the same as Cancel on that message.

  • Open a text thread or hand a customer to a teammateconversation_owner

    open finds or opens the text thread for a contact (and job), the same as opening their conversation, and sends nothing.

  • Review which job an email belongs toemail_job_matches

    Admins only, the same as the inbox's match review.

  • Link calls to a contact or job, mark spam or admin-onlycall_records

    Records only, no dialing.

  • Read a call's summary or confirm its follow-up taskcall_follow_up

    intelligence reads a call's summary and suggested follow-up; receipt reads the follow-up already saved; confirm saves the follow-up task the rep agreed to, the same as Confirm on the call.

  • Find and merge duplicate jobs or contactsmerge_duplicates

    Admins only.

  • Make an invoice pay linkmake_pay_link

    Make a pay link for an invoice the rep can see.

  • Email a customersend_email

    Email one contact through the same guarded Hodos sender as the Inbox.

  • Text a customersend_text

    Text one contact from the rep's own Hodos number, the same as sending from the Hodos inbox.

  • Add a file to a jobupload_job_file

    Attach one file (for example a PDF estimate the rep just made) to a job's files, the same as Upload in the app, so it shows on web and phone.

  • Add an emailed PDF to a job's filesadd_email_pdf_to_job

    Add to files on a PDF from an email filed to the job, the same as on the job's Documents.

  • Prepare an original job file uploadprepare_job_file_upload

    Use for files larger than 3 MiB, instead of sending the original in one MCP request.

  • Upload one original file partupload_job_file_chunk

    Send one consecutive part from prepare_job_file_upload, indexed from zero, as base64 without whitespace or a data: prefix.

  • Verify and register an original job filefinalize_job_file_upload

    Call after every part of prepare_job_file_upload has been received.

What it never does

  • Calling or queueing a phone call to a customer
  • Sending a customer email the rep has not approved word for word
  • Sending a text the rep has not approved word for word
  • Changing demo mode, messaging mode, or any messaging configuration
  • Charging a card or refunding a payment (recording money already received is fine)
  • Uploading a file (attach it in the Hodos app instead)
  • Deleting a file for good (archive it instead; an admin deletes in the app)

Texts, emails and calls go out from the Hodos inbox, where consent and opt-out checks run. An assistant can draft the words for you to send.

Use the REST API

For a program rather than a person. An admin creates a key in Hodos under Settings, API access, picks what it may do and when it expires, and copies the secret once. A key sees only its own company and never more than the admin who made it.

Base URLhttps://hodos.strutq.com/api/v1

Send the key on every call, then check it works:

Check a key
curl https://hodos.strutq.com/api/v1/me \
  -H "Authorization: Bearer $HODOS_API_KEY"
List jobs
curl "https://hodos.strutq.com/api/v1/jobs?limit=25" \
  -H "Authorization: Bearer $HODOS_API_KEY"

Try it in Postman

Download the Postman collection, import it, and paste your key into the apiKey variable. Run the folders from the top. List calls save an id that the calls after them use, and the test records are tagged or titled as Postman tests.

How a call works: your program sends the key, Hodos checks the key and its scope, then reads or changes your company's records and answers with data and a request id. A new record also needs an Idempotency-Key. A file goes in three steps: reserve, send the bytes, finish.

Every call

  1. Your callKey in the header. New records add an Idempotency-Key.
  2. Hodos checksKey valid, scope allowed, under the rate limit.
  3. Your recordsRead or change. You get data and a request_id.

Uploading a file

  1. ReservePOST uploads. You get an upload_url.
  2. Send the bytesPUT the file to that address.
  3. FinishPOST finalize. The file shows on the job.

Scopes

Each key carries only the scopes the admin ticks. Ticking one adds the scopes it depends on.

ScopeLets the key
contacts.readRead contact names, addresses, phone numbers and email addresses.
contacts.updateSet, add or remove contact tags. Also needs contacts.read.
jobs.readRead jobs, insurance claims, and the pipelines and stages a job sits in.
jobs.updateSet, add or remove job tags. Also needs jobs.read.
notifications.readRead the key owner's own Hodos notifications. An alert about a job, contact, task, file, call or appointment only appears if the key's access profile can also read that kind of record.
notifications.updateMark one or all of the key owner's notifications read. Also needs notifications.read.
tasks.readRead tasks, open and completed, and the teammates they can be assigned to.
notes.readRead the shared notes on a claim's job. Private notes stay hidden. Also needs jobs.read.
files.readList the shared photos and documents on a job or claim. Also needs jobs.read.
files.downloadDownload those photos and documents. Also needs jobs.read and files.read.
tasks.createCreate tasks, tied to a job or contact and assigned to teammates. Also needs tasks.read.
tasks.updateMark a task done, or reopen it. Also needs tasks.read.
tasks.archiveDelete a task. It is archived, not destroyed, and drops out of the API. Also needs tasks.read.
notes.createAdd a shared note to a job or claim, and tag teammates in it so they are notified. Finding teammate ids needs the Tasks scope. Also needs jobs.read and notes.read.
files.createUpload photos and documents to a job or claim, singly or up to 20 at a time. Also needs jobs.read and files.read.

Endpoints

Every call, with its fields and response shapes, is in the OpenAPI document, which most code generators and AI agents read directly. The Postman collection has every call ready to run.

Account

GET/meNo scope

Check the API key

Returns the key's id, its company (org_id), the scopes it can use right now, and when it expires. Call this first to confirm a key works. Needs no scope.

Example request
curl "https://hodos.strutq.com/api/v1/me" \
  -H "Authorization: Bearer $HODOS_API_KEY"

Contacts

GET/contactscontacts.read

List contacts

Lists the company's contacts (homeowners and other customers), newest first. Archived contacts are left out. Page through with cursor. Needs contacts.read.

Example request
curl "https://hodos.strutq.com/api/v1/contacts" \
  -H "Authorization: Bearer $HODOS_API_KEY"
GET/contacts/{id}contacts.read

Get a contact

Returns one contact by id. Needs contacts.read.

Example request
curl "https://hodos.strutq.com/api/v1/contacts/{id}" \
  -H "Authorization: Bearer $HODOS_API_KEY"
PATCH/contacts/{id}/tagscontacts.update

Change a contact's tags

Changes the tags on a contact. Send set to replace them all, or add and/or remove to change some. Tags are 1 to 40 characters, up to 50 per contact, and matching ignores capitals. Repeating the same call changes nothing more. Needs contacts.read and contacts.update.

This call sends a body. See the worked examples under Responses and paging, or the OpenAPI document for every field.

Jobs

GET/jobsjobs.read

List jobs

Lists the company's jobs, newest first. Archived jobs are left out. Each job names its contact, its pipeline and the stage it sits in. Page through with cursor. Needs jobs.read.

Example request
curl "https://hodos.strutq.com/api/v1/jobs" \
  -H "Authorization: Bearer $HODOS_API_KEY"
GET/jobs/{id}jobs.read

Get a job

Returns one job by id. Needs jobs.read.

Example request
curl "https://hodos.strutq.com/api/v1/jobs/{id}" \
  -H "Authorization: Bearer $HODOS_API_KEY"
PATCH/jobs/{id}/tagsjobs.update

Change a job's tags

Changes the tags on a job. Send set to replace them all, or add and/or remove to change some. Tags are 1 to 40 characters, up to 50 per job, and matching ignores capitals. Repeating the same call changes nothing more. Needs jobs.read and jobs.update.

This call sends a body. See the worked examples under Responses and paging, or the OpenAPI document for every field.

POST/jobs/{id}/notesnotes.create

Add a note to a job and tag teammates

Adds a plain-text note to the job's timeline. The team sees it; the customer does not. List teammates in mention_user_ids (from the team list, up to 20) to tag them: each gets a Hodos alert and, unless they turned it off, an email, the same as a tag typed in the app. Send a unique Idempotency-Key. Needs jobs.read, notes.read and notes.create.

This call sends a body. See the worked examples under Responses and paging, or the OpenAPI document for every field.

GET/pipelinesjobs.read

List pipelines and stages

Lists the company's job pipelines in board order, each with its stages in order, so a job's pipeline_id and stage_id can be shown by name. One page holds them all. Needs jobs.read.

Example request
curl "https://hodos.strutq.com/api/v1/pipelines" \
  -H "Authorization: Bearer $HODOS_API_KEY"

Files

GET/jobs/{id}/filesfiles.read

List files on a job

Lists file details (not the bytes) on the job, newest first. Download one with the file download call. Needs jobs.read and files.read.

Example request
curl "https://hodos.strutq.com/api/v1/jobs/{id}/files" \
  -H "Authorization: Bearer $HODOS_API_KEY"
POST/jobs/{id}/files/uploadsfiles.create

Start a file upload on a job

Step 1 of 2 for one file. Reserves an upload and returns a one-time upload_url. PUT the raw bytes there with upload_metadata base64-encoded in an x-metadata header, then call finish upload. The Idempotency-Key must equal request_id. Needs jobs.read, files.read and files.create.

This call sends a body. See the worked examples under Responses and paging, or the OpenAPI document for every field.

POST/jobs/{id}/files/uploads/bulkfiles.create

Start up to 20 file uploads on a job

Step 1 of 3 for many files. Reserves up to 20 uploads in one call; each answer carries its own status and upload, or an error. Repeating a request_id returns the same reservation. PUT each file's bytes to its upload_url (in parallel is fine), then call bulk finish. Needs jobs.read, files.read and files.create.

This call sends a body. See the worked examples under Responses and paging, or the OpenAPI document for every field.

GET/claims/{id}/filesfiles.read

List files on a claim's job

Lists file details (not the bytes) on the claim's job. Download one with the file download call. Needs jobs.read and files.read.

Example request
curl "https://hodos.strutq.com/api/v1/claims/{id}/files" \
  -H "Authorization: Bearer $HODOS_API_KEY"
GET/files/{id}/downloadfiles.download

Download a file

Returns the bytes of one file this key can see. Needs jobs.read, files.read and files.download.

Example request
curl "https://hodos.strutq.com/api/v1/files/{id}/download" \
  -H "Authorization: Bearer $HODOS_API_KEY"
POST/claims/{id}/files/uploadsfiles.create

Start a file upload

Step 1 of 2. Reserves an upload for the claim's job and returns a one-time upload_url. PUT the raw bytes there with upload_metadata base64-encoded in an x-metadata header, then call finish upload. The Idempotency-Key must equal request_id. Needs jobs.read, files.read and files.create.

This call sends a body. See the worked examples under Responses and paging, or the OpenAPI document for every field.

POST/files/uploads/{id}/finalizefiles.create

Finish a file upload

Step 2 of 2. Checks the uploaded file's type, size and the checksum you declared match what was reserved, and adds the file to the job. Returns 202 if the bytes have not arrived yet; call again shortly. Needs jobs.read, files.read and files.create.

This call sends a body. See the worked examples under Responses and paging, or the OpenAPI document for every field.

POST/files/uploads/bulk-finalizefiles.create

Finish up to 20 file uploads

Step 3 of 3 for many files. Checks each uploaded file against what was reserved and adds it to its job. Each answer carries its own status: 200 registered, 202 bytes not there yet (call again shortly), or an error. Needs jobs.read, files.read and files.create.

This call sends a body. See the worked examples under Responses and paging, or the OpenAPI document for every field.

Tasks

GET/taskstasks.read

List tasks

Lists the company's tasks, newest first, open and completed. A task with completed_at set is done. Page through with cursor. Needs tasks.read.

Example request
curl "https://hodos.strutq.com/api/v1/tasks" \
  -H "Authorization: Bearer $HODOS_API_KEY"
GET/tasks/{id}tasks.read

Get a task

Returns one task by id. Needs tasks.read.

Example request
curl "https://hodos.strutq.com/api/v1/tasks/{id}" \
  -H "Authorization: Bearer $HODOS_API_KEY"
POST/taskstasks.create

Create a task

Creates a task, optionally tied to a job or contact and assigned to teammates. Send a unique Idempotency-Key: repeating the same key with the same body returns the task already made (200) instead of a second copy, and reusing it with a different body returns 409. Needs tasks.create.

This call sends a body. See the worked examples under Responses and paging, or the OpenAPI document for every field.

PATCH/tasks/{id}tasks.update

Mark a task done or reopen it

Send {"completed": true} to mark the task done or {"completed": false} to reopen it. Doing the same thing twice is harmless. The job timeline records it as done by the key's owner. Needs tasks.update.

This call sends a body. See the worked examples under Responses and paging, or the OpenAPI document for every field.

DELETE/tasks/{id}tasks.archive

Delete a task

Deletes a task the way the app does: it is archived, not destroyed, and no longer appears in task lists or reads. Deleting it twice returns not found. Needs tasks.archive.

Example request
curl -X DELETE "https://hodos.strutq.com/api/v1/tasks/{id}" \
  -H "Authorization: Bearer $HODOS_API_KEY"

Team

GET/teamtasks.read

List teammates

Lists the company's active people with their name and role, so a task's assignee_id or a note's author_user_id can be shown by name, and assignee_ids can be filled when creating a task. One page holds them all. Needs tasks.read.

Example request
curl "https://hodos.strutq.com/api/v1/team" \
  -H "Authorization: Bearer $HODOS_API_KEY"

Claims

GET/claimsjobs.read

List insurance claims

Lists insurance claims on jobs this key can see. Filter with claim_number. A claim number is not unique across carriers, so check the job before choosing a match. Needs jobs.read.

Example request
curl "https://hodos.strutq.com/api/v1/claims" \
  -H "Authorization: Bearer $HODOS_API_KEY"
GET/claims/{id}jobs.read

Get an insurance claim

Returns one claim with the job it belongs to. Needs jobs.read.

Example request
curl "https://hodos.strutq.com/api/v1/claims/{id}" \
  -H "Authorization: Bearer $HODOS_API_KEY"
GET/claims/{id}/notesnotes.read

List notes on a claim's job

Lists the shared notes on the claim's job, newest first. Needs jobs.read and notes.read.

Example request
curl "https://hodos.strutq.com/api/v1/claims/{id}/notes" \
  -H "Authorization: Bearer $HODOS_API_KEY"
POST/claims/{id}/notesnotes.create

Add a note to a claim's job

Adds a plain-text note to the claim's job timeline. The team sees it; the customer does not. Send a unique Idempotency-Key. Needs jobs.read, notes.read and notes.create.

This call sends a body. See the worked examples under Responses and paging, or the OpenAPI document for every field.

Notifications

GET/notificationsnotifications.read

List the key owner's notifications

Lists the Hodos notifications of the person who owns the key, newest first, each with whether it has been read. Add unread=true for only the unread ones. href is a Hodos path, such as /jobs/{id}. Needs notifications.read.

Example request
curl "https://hodos.strutq.com/api/v1/notifications" \
  -H "Authorization: Bearer $HODOS_API_KEY"
POST/notifications/{id}/readnotifications.update

Mark a notification read

Marks one notification read, by the id the list gave. Needs notifications.read and notifications.update.

Example request
curl -X POST "https://hodos.strutq.com/api/v1/notifications/{id}/read" \
  -H "Authorization: Bearer $HODOS_API_KEY"
POST/notifications/read-allnotifications.update

Mark all notifications read

Marks everything up to now read for the key owner. Needs notifications.read and notifications.update.

Example request
curl -X POST "https://hodos.strutq.com/api/v1/notifications/read-all" \
  -H "Authorization: Bearer $HODOS_API_KEY"

Responses and paging

Every answer is JSON with data and a request_id. Lists return up to limit records, 1 to 100, and a page.next_cursor. Pass it back as cursor for the next page and stop when it is null.

A list response
{
  "data": [
    { "id": "6f1c", "name": "Smith roof replacement", "stage_id": "..." }
  ],
  "page": { "next_cursor": "eyJ2Ijox" },
  "request_id": "0b7e"
}

Calls that make a new record (tasks, notes, single file uploads) need an Idempotency-Key header, unique per record. Sending the same key and body again returns the record already made instead of a second copy, so a retry after a dropped connection is always safe.

Create a task
curl https://hodos.strutq.com/api/v1/tasks \
  -X POST \
  -H "Authorization: Bearer $HODOS_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"title":"Call the adjuster","priority":"high","due_date":"2026-10-06"}'

Assign people by sending assignee_ids, ids from the team list. A task is marked done or reopened with PATCH and deleted with DELETE. A deleted task is archived, not destroyed, and leaves the task lists.

Complete or delete a task
# Mark a task done (send false to reopen it)
curl https://hodos.strutq.com/api/v1/tasks/$TASK_ID \
  -X PATCH \
  -H "Authorization: Bearer $HODOS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"completed":true}'

# Delete a task (it is archived, not destroyed)
curl https://hodos.strutq.com/api/v1/tasks/$TASK_ID \
  -X DELETE \
  -H "Authorization: Bearer $HODOS_API_KEY"

Tags are changed with PATCH. A note can tag teammates by their id from the team list: each one gets an alert in Hodos and an email, unless they turned that off. Files can go up to 20 at a time, and notifications are the key owner's own.

Tag a job
curl https://hodos.strutq.com/api/v1/jobs/$JOB_ID/tags \
  -X PATCH \
  -H "Authorization: Bearer $HODOS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"add":["supplement"],"remove":["new lead"]}'
Add a note that tags a teammate
curl https://hodos.strutq.com/api/v1/jobs/$JOB_ID/notes \
  -X POST \
  -H "Authorization: Bearer $HODOS_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"body":"Supplement approved. Please invoice.","mention_user_ids":["'"$TEAMMATE_ID"'"]}'
Reply to a note
curl https://hodos.strutq.com/api/v1/jobs/$JOB_ID/notes \
  -X POST \
  -H "Authorization: Bearer $HODOS_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"body":"Thanks, sending the invoice now.","in_reply_to":"'"$NOTE_ID"'"}'
Upload up to 20 files
# 1. Reserve up to 20 uploads. Each file needs its own request_id and attachment_id (UUIDs) and its sha256.
curl https://hodos.strutq.com/api/v1/jobs/$JOB_ID/files/uploads/bulk \
  -X POST \
  -H "Authorization: Bearer $HODOS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"files":[{"request_id":"'"$REQ_1"'","attachment_id":"'"$ATT_1"'","name":"scope.pdf","kind":"scope","mime_type":"application/pdf","size_bytes":48213,"sha256":"'"$SHA_1"'"}]}'

# 2. PUT each file to its upload_url, with upload_metadata base64-encoded in x-metadata.
# 3. Finish them all at once.
curl https://hodos.strutq.com/api/v1/files/uploads/bulk-finalize \
  -X POST \
  -H "Authorization: Bearer $HODOS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"intent_ids":["'"$INTENT_1"'"]}'
Read unread notifications
curl "https://hodos.strutq.com/api/v1/notifications?unread=true" \
  -H "Authorization: Bearer $HODOS_API_KEY"

Each key can make 120 calls a minute and each company 1,200. Creating, changing or deleting tasks is capped at 30 a minute per key. The API cannot text, email or call customers, take payments, sign documents, or write to JobNimbus.

Errors

An error response
{
  "error": { "code": "insufficient_scope", "message": "The API key does not have the required scope." },
  "request_id": "0b7e"
}
StatusCodeMeaning
400invalid_requestA field, parameter or cursor is wrong. Check the call against the OpenAPI document.
401invalid_api_keyThe key is missing, mistyped, revoked or expired, or its admin lost access.
403insufficient_scopeThe key is real but lacks the scope this call needs.
404not_foundNo record with that id, or the key cannot see it.
409idempotency_conflictThat Idempotency-Key was already used with a different body.
409upload_expiredThe upload reservation ran out before the bytes arrived. Start again.
413file_too_largeThe file is over the size limit.
422upload_metadata_mismatchThe uploaded file's type, size or declared checksum does not match what was reserved.
429rate_limitedOver 120 calls a minute for one key, 1,200 for the company, or 30 task changes a minute for one key. Wait for Retry-After seconds.
503service_unavailableHodos could not answer just now. Retry with backoff.