MCP App Store
by KeenEthics

Overview

Portalbase is the work platform for frontline teams in any industry: retail stores, restaurants and hotels, manufacturing and warehouses, construction and field service, facilities, fleets and more. It holds the work people do every shift: tasks handed out, checklists and inspections, forms, training, certifications, equipment and company documents. Connect it to ask what's overdue, who isn't current on their training or certifications, which inspections failed, or what a procedure says, with the passage and page. Allow changes, and it can hand out work, open a corrective action or send an announcement to a store, site or team. It acts as the person who connected it, sees only what they can see, and every change lands in the company's audit log under their name. Needs a Portalbase account, and the company's admin turns AI connections on.

Tools

acknowledge_shift

ChatGPT
Acknowledge an area at shift change on a Shift form, as the incoming person, maybe offline. id is made on the phone. exam_id is the newest exam (a submission of the form at the area) the phone had, if any; someone who signed it can't acknowledge it. seen_through is the newest entry the phone held (when the server got it), so entries written before the acknowledgment that arrive after it are flagged for the acknowledger. Needs one of the form's acknowledging roles at the area or above (or, with none set, to work there). The acknowledgment before the last one is the line: phones let go of entries before it that aren't still open.

add_asset_tag

ChatGPT
Tag an asset so a scan opens it. kind qr makes a new QR tag: the server picks its code, the answer gives the code and the link the label encodes, and any QR tag the asset had stops working. kind barcode records a barcode already on it (value is the text it scans as), unique in the company. Needs assets.manage at its unit.

add_dashboard_widget

ChatGPT
Add one widget to the end of a dashboard: a metric, how it's drawn, what it's broken down by and its own filters, as a dashboard's widgets take them. What the question box's "save to dashboard" does. Needs to be the dashboard's owner, or reports.manage for the whole company.

add_library_quiz_version

ChatGPT
Save a new version of a library quiz, with a note on what changed. It becomes the current one. Trainings keep the version they use, unless update_trainings is true: then each training using an earlier version (in what crews take now, or in its draft) gets a draft with this one, to review and publish. A training you can't change is left and named. Needs content.manage where the quiz applies.

add_log_entry

ChatGPT
Add to an area's running log on a Shift form (a form of kind handover), as written on a phone, maybe offline and maybe hours ago. id is made where it was written, so sending it again is the same entry. org_unit_id is the area, one of the form's areas; version_id the published version it was written on; author_person_id who wrote it (on a shared tablet, the worker it's switched to). kind entry: something found, answers keyed by the form's finding section only (context.now is the local wall time, context.pick_lists the pick list versions used), with each photo declared in media; open true leaves it as an item for the next shift until someone fixes it, and if the form puts open findings in the pool it becomes a pooled task there. kind fixed: item_id is an open item, now fixed; its task, if it has one, closes as done by the author. kind handed: item_id becomes a task, to_person_id's, or with none the area's pool; handing it to someone else or the pool needs work.manage at the area, taking it yourself doesn't. note is a few words with a fixed or handed entry. Where the form's running log is off, only someone who can sign it adds findings. What anyone wrote never changes; a correction is a new entry.

add_membership

ChatGPT
Give a person a role at an org unit. It applies there and to everything under it; people can work in several places with a different role in each. You can only give a role whose permissions you hold at that unit, with people.manage there.

add_repair

ChatGPT
Add something to fix on an asset, with an optional owner. If the asset is out of service, the repair joins that outage and has to be closed before the release. Needs assets.manage or work.manage where the asset is. A failed inspection step adds its own.

add_repair_note

ChatGPT
Add a note to a repair: what was found, what was done, a part on order. Needs assets.manage or work.manage where the asset is, or owning the repair.

archive_bundle

ChatGPT
Archive a learning path or routine so it can't be issued any more. Runs already out carry on. Needs content.manage or work.manage where it applies.

block_assignment

ChatGPT
Say an assignment is blocked and why: waiting on parts, the area isn't safe, someone else's work isn't done. Blocked is where delays come from, so the reason shows on the supervisor's board. A photo can go with it: declare it in photo (its id, type, size and SHA-256) and the bytes are uploaded separately, from a phone with no signal too. The person who has it or a supervisor can block it. The answer says applied, or kept with a note when it couldn't change anything any more (it was cancelled, someone else took it). Either way the record is kept.

cancel_announcement

ChatGPT
Cancel an announcement before it goes out. One that went out stays; send another to correct it. Needs to be its sender, or work.manage where it goes.

cancel_assignment

ChatGPT
Cancel work that isn't done, with why. Anything a worker does with it afterward, offline or not, is kept as a record and changes nothing. Needs work.manage at its unit. The answer says applied, or kept with a note when it couldn't change anything any more (it was cancelled, someone else took it). Either way the record is kept.

cancel_bundle_run

ChatGPT
Cancel a run: its open work is cancelled with the reason, and nothing more unlocks. Work already done stays on the person's record. Needs work.manage where the run is.

cancel_workflow_run

ChatGPT
Cancel a workflow run that's still going, with why. Work it handed out that isn't done is cancelled too. Needs work.manage where it runs.

change_class

ChatGPT
Change a class: its title, time, place, trainer or seats, or cancel it with a reason (cancelled true). More seats move the first on the wait list up; seats can't go below who's signed up. A cancelled class doesn't change after, and everyone signed up or waiting is told. Fields left out don't change. Needs content.manage or work.manage where it's offered.

change_course

ChatGPT
Move a course to another org unit (it then applies there and under it; needs content.manage at both), or archive it (archived true: it can't be assigned any more, work already handed out stays) or bring it back (archived false). Fields left out don't change.

change_document

ChatGPT
Rename a library document, move it to another org unit (needs content.manage at both), archive it (archived true) or bring it back (archived false), keep it on every phone where it applies (required_offline true) or not, or put it in another category (procedure, safety_data_sheet, manual, other). Its versions don't change. Fields left out don't change.

change_inspection_result

ChatGPT
Change one step's result after watching it, with the reason, for example a pass that the clip shows is a fail. Give the result it has now (from_result): if someone changed it since, this is refused, so look again. The new result has to be one the step takes. What the worker gave stays on the record beside the change. Needs work.manage where the inspection was done, and not on an inspection the caller did.

change_library_quiz

ChatGPT
Rename a library quiz, move it to another org unit (refused if a training using it is somewhere it wouldn't apply), or archive it or bring it back. An archived quiz can't be picked for a new step; trainings already using it keep it. Needs content.manage where it applies, and where it moves to.

check_qualifications

ChatGPT
Whether a person holds every certification required where they work and in their roles: each requirement, and whether they're current, expiring, expired or missing it. Needs the caller to manage work, read records or manage people where the person works, or to be that person.

claim_assignment

ChatGPT
Claim a pooled assignment so it's yours. The first claim the server gets wins; a later one is kept, noted "Someone else took it." Anyone working at its unit, above it or under it, in its pool role if it has one, can claim. On a shared device, it's claimed for the worker using it. The answer says applied, or kept with a note when it couldn't change anything any more (it was cancelled, someone else took it). Either way the record is kept.

close_repair

ChatGPT
Close a repair: fixed, or nothing needed fixing, with what was done. A closed repair stays closed. Needs assets.manage or work.manage where the asset is, or owning the repair.

close_survey

ChatGPT
Close a survey now: cancel the work nobody did (it takes no more answers once its close date passes). The close job does this the day after the close date, as whoever sent it last. Needs work.manage where the work is.

comment_on_inspection

ChatGPT
Comment on an inspection, or on one of its steps (give the step's id from the record). Anyone who can see the inspection can comment. Comments can't be changed or removed. It's the comment_on_inspection command of the Portalbase API (https://portalbaseai.com/api/v1/openapi.json).

complete_assignment

ChatGPT
Complete an assignment. If it needs a photo, a signature, its form or its inspection to close, name that record as evidence (type and id); without it the completion is kept and changes nothing. If it needs a supervisor's verification it becomes done and waits for a supervisor to verify it. Completing one in its pool claims it. The answer says applied, or kept with a note when it couldn't change anything any more (it was cancelled, someone else took it). Either way the record is kept.

complete_bundle_run

ChatGPT
Mark a run complete once every required item is done (a cancelled one counts as waived). Refused while any is still to do. The bundle job runs it once a run's items are all done; certifications listen for the event.

create_asset

ChatGPT
Add an asset to the registry: a piece of equipment, a vehicle, a tool or a place crews inspect, of one asset type, at one org unit. Give it a name people use ("Truck 114") and, if the company numbers its equipment, a code, unique among its assets. attributes are the fields its asset type defines, by key, checked against the type. Needs assets.manage at that unit. QR tags and barcodes are added to it separately, so a scan opens it.

create_asset_type

ChatGPT
Add an asset type, such as forklift, dump truck or trench box, with the fields every asset of that type carries (a forklift's capacity and serial, a truck's VIN). Inspection templates attach to asset types. meters lists the meters its assets carry: hours, miles, kilometers. Needs reference.manage. Fields are a list of {key, label, type} where type is text, integer, number, boolean, date or pick_list, with optional required, min, max, max_length, and pick_list_key for a pick_list field.

create_assignment

ChatGPT
Hand out work at an org unit: a task, a course, a form, an inspection, a document to read and sign (acknowledgment) or a skill check. Give it to a person (assignee_person_id) or to the unit's pool (pooled true, optionally only for holders of pool_role_id), where anyone working at the unit, above it or under it can claim it, first come. Due on a day (due_on, YYYY-MM-DD where the work is) or in a window (window_starts_at and window_ends_at), or neither. close_requirement says what closes it: none, photo, signature, form, inspection, or verification by a supervisor. Left out, it's what usually closes that kind: a form closes when it's submitted, an inspection the same, a document to read and sign with a signature, a skill check when a supervisor verifies it, a task or course when it's marked done. Forms and inspections show in their own tile and in Tasks as the same record. Needs work.manage at the unit. The id may be made by the caller, so a phone can hand work out offline. workflow is for the workflow job only: the run and step the work is for. statement is what whoever has it signs, for work that closes with a signature. steps are a task's steps in order, each a title, words, and a photo, clip or PDF declared by id, type, size and SHA-256 and uploaded separately, up to 30. Sending the same id again by the same person gives back the same work.

create_bundle

ChatGPT
Build a learning path (shown in Training: courses in order, then the skill check) or a routine (shown in Tasks: a set of work for a role at a place, often issued every week by a schedule), at an org unit, applying there and under it. Saved as version 1. items is the whole list, in order: each has a key (lowercase, unique in the list), a kind (course, skill_check, inspection, form, task, acknowledgment), a title, and for a course its course (subject_type course), for an inspection or skill check its template (subject_type inspection_template), for a form its form (subject_type form_template), published where the bundle applies. Each is required unless it has required false, which makes it optional. after lists keys of items before it that have to be done first; a cancelled one counts as waived. due_days is days to do it once it's handed out. Needs content.manage or work.manage at the unit. The id may be made by the caller.

create_class

ChatGPT
Set up a class: one in-person sitting of a published course, offered at an org unit for the people there and under it. Give when it starts and ends with the time zone it's held in, where, how many seats, and the trainer: someone in the company by person id, or an outside trainer by name. Sign-up closes when it starts unless you give an earlier time. Needs content.manage or work.manage where it's offered. The id may be made by the caller.

create_corrective_action

ChatGPT
Open a corrective action: something to fix, handed to one owner. title says what, description what's wrong and what needs doing. cause links it to what caused it: an inspection step marked Fail or Concern (inspection_step_id), a form answer (form_submission_id and the question's field_key, with its row in a repeated section like crew[1].initials), or an observation (something seen, described in the description). priority is low, normal, high or urgent; urgent ones also reach the owner by text. org_unit_id is where it's fixed; opening one needs work.manage there. owner_person_id gets the work, due on due_on (YYYY-MM-DD where it's fixed). asset_id names equipment it's about; from an inspection it's the inspection's asset. The owner records the fix with photos and a signature, then someone who manages work there signs it off. id may be made by the caller, so sending it again is the same action. workflow is for the workflow job only: the run and step it's for.

create_course

ChatGPT
Add a course at an org unit. It applies there and everywhere under it, and needs content.manage there. It starts as an empty draft; its lessons are saved to the draft, which is then published. The id may be made by the caller.

create_dashboard

ChatGPT
Build a dashboard: a title and a grid of widgets, each a report metric drawn one way (kpi, gauge, line, area, column, bar, stacked, donut, heatmap, table), broken down by a slice, with its own filters if wanted. Or copy one with copy_from: a prebuilt tab's key or a dashboard the caller sees; widgets given with a copy are added after the copied ones. Only the caller sees it until reports.manage shares it. Needs reports.read somewhere. The id may be made by the caller.

create_form_template

ChatGPT
Start a new form, such as Daily job report. It applies at org_unit_id and everything under it (left out, the whole company). kind is standard, anonymous for a form anyone can send from its own page by scanning its QR code, with no sign-in and nothing kept about who sent it (so no signatures, initials, crew, photos, videos, files, markup, location, person, asset or unit questions, no library documents, and nothing that reads who's filling it), or handover for a Shift form (an area's running log and the exam signed at shift change: exactly two sections keyed finding, what Add captures, and sign_off, what Sign captures; where it runs and who signs are set separately), or survey: sent to sites and roles separately, closing on closes_on (YYYY-MM-DD where it applies), named or anonymous (anonymous true: the answers keep nobody's name, so it can't ask for signatures, initials, photos, files or a location, or read who's filling it; fixed once published). core names a locked core for a regulated kind of form (workplace_exam: a Shift form's workplace exam, 30 CFR 56.18002): the form starts on the core's newest version with its questions in place, which can be added around but not removed, renamed or changed. Its first version starts as a draft that crews don't see until it's published. Needs templates.manage at that unit. The definition is format 1 JSON (packages/forms/README.md): sections of fields, each field {key, type, label} plus what its type takes. A choice has options [{key, label, outcome?}] where outcome pass, concern or fail flags the answer for review. A pick_list field names a company pick list by pick_list_key. Make a section or question site-specific with visible_when {op: 'at_unit', args: [{value: '<unit id>'}]}. A draft can be saved with problems in it; the result lists them, and publishing is refused until there are none.

create_inspection_template

ChatGPT
Start a new inspection template, such as Forklift pre-use. It applies at org_unit_id and everything under it (left out, the whole company), and to the asset types listed. Its steps start as draft version 1, which crews don't see until it's published. kind skill_check makes a skill check template instead (step 3.7): someone records a worker doing a task against these steps, and both sign; valid_months says how long a pass is good for (left out, it doesn't expire). The kind can't change later. Needs templates.manage at that unit. Steps are a list in the order the worker runs them, each {id, title, instruction, evidence, results}: id is a UUID you make for a new step and keep when the step carries into a later version; the instruction says what to do and what right looks like, and is read aloud while the worker records; evidence is video, photo, reading or note; results is any of pass, concern and fail. Optional: critical true (needs a fail result; a fail can take the asset out of service), and for a reading step reading_unit (required, like psi or hours) with reading_min and reading_max.

create_library_quiz

ChatGPT
Save a quiz to the training library at an org unit, with its first version: pass_percent and questions, as a course's quiz step takes them. It applies there and everywhere under it, and needs content.manage there. A training uses it by naming its version on a quiz step (library_quiz_version_id); the step plays its own copy, so a published training keeps the version it was published with. The id may be made by the caller.

create_org_level

ChatGPT
Add a level to the company's structure, such as district, plant or crew, placed directly below another level. Levels below it move down one. Units can skip levels. Needs company.manage. Fields are a list of {key, label, type} where type is text, integer, number, boolean, date or pick_list, with optional required, min, max, max_length, and pick_list_key for a pick_list field.

create_org_unit

ChatGPT
Add an org unit (a site, crew, district or anything at a level the company defined) under a parent unit. Its level must sit below the parent's. Attributes are the level's fields, by key. Needs org.manage at the parent or above.

create_person

ChatGPT
Add a person to the company with at least one place they work: an org unit and their role there. Email, mobile phone (with country code) and employee ID are how they'll sign in; people without a company email sign in with the phone or the employee ID. hire_date (YYYY-MM-DD) is the day they started; schedules count from it. The caller can only give a role whose permissions they hold at that unit, and needs people.manage there.

create_pick_list

ChatGPT
Add a pick list, such as hazard types or PPE, with its items. Version 1 is published at once, ready for forms and fields. Each item is {key, label}; keys are lowercase and never change, labels can. Needs reference.manage.

create_qr_codes

ChatGPT
Make QR codes, so a printed label opens a thing: a document (an SOP), a course, a form (form_template), an inspection (inspection_template) or an area (org_unit), by its id. The server picks each code. A thing that already has a live code keeps it, so printing again prints the same code; a code opens the thing's current version, so it survives new versions. Equipment has its own tags. Needs, for each thing, what managing it takes where it is: content.manage for a document or course, templates.manage for a form or inspection, org.manage for an area. The answer lists every code with what it opens and the link its label encodes.

create_role

ChatGPT
Add a role, such as Foreman or Safety lead, with what it can do. A role does nothing until someone holds it at an org unit, where it applies to that unit and everything under it. Kind is worker, supervisor, admin or viewer. Permissions come from: company.manage, org.manage, people.manage, devices.manage, reference.manage, audit.read, integrations.manage, work.manage, records.read, reports.read, templates.manage, assets.manage, content.manage, certifications.manage, workflows.manage, retention.manage, reports.manage. Needs company.manage.

create_schedule

ChatGPT
Add a schedule that hands out work on its own at an org unit and everywhere under it. It acts as you, with your permissions as they are each time it runs, so you need work.manage there; if you lose it, the schedule stops and says why. Who: target each_person gives everyone working at the unit or under it their own (only holders of role_ids if any are listed, and only people who started on or after starts_on if new_hires_only); target pool puts one in the pool of each unit at pool_level_id under it (or of the unit itself), claimable by holders of pool_role_id if set. When: cadence once (due due_days after they start, by hire date or the day they were added) or repeat (the same, then again repeat_every repeat_unit after the last is done, issued lead_days early) for each person; daily on days_of_week (1 Monday to 7 Sunday), weekly on one day, monthly on day_of_month, each due that day or in a window from window_start for window_minutes; or shift, every start of shift_ids, due within the shift (each unit gets the shifts at, above or under it that reach it); or dates, every year on each of dates (MM-DD, up to 12) for each person, going out lead_days early and due due_days after the date. Days and times are on the unit's clock. Work goes out at midnight where the work is on the day it falls. kind is the assignment kind; a course schedule can name its course (subject_type course) and an inspection schedule its template (subject_type inspection_template), which have to be published where the schedule applies. kind bundle hands out a learning path or routine instead (subject_type bundle, its id), as a run for each person: every week for a weekly routine, once or on repeat for a learning path; its items carry their own due days. starts_on defaults to today. The first run happens within minutes, or it can be run at once.

create_shift

ChatGPT
Add a shift at an org unit: a name (Day, Night, Swing), when it starts and ends on the unit's clock (24-hour; an end at or before the start means the next morning), and the days it starts on (1 Monday to 7 Sunday, all seven if left out). It applies at the unit and everywhere under it. Schedules use shifts to hand out work every shift. carry_unfinished on sends pool work still open when the shift ends back to the pool for the next shift there. Needs org.manage at the unit.

create_user_type

ChatGPT
Add a user type, such as Flagger or Foreman. A user type decides what someone sees on their home screen; it grants no access. Needs company.manage. Its home screen tiles and its people are set separately.

create_workflow

ChatGPT
Create a workflow, turned off, with its first draft: a name, what it's for, and the unit it applies at and under. Nothing runs and nobody is affected while it's off. It can be removed while it's off. Needs workflows.manage at that unit. definition is the workflow as JSON, format 1: a trigger (an event topic with an optional condition, or by hand with the roles who may start it), the step it starts at, and its steps, each with a key, a type, a title and where it goes next. Problems come back in words.

deactivate_person

ChatGPT
Deactivate a person. It takes effect at once: their sessions end, the server refuses them, their phones stop syncing, and each of their phones clears our data at its next contact. Records they made stay. You can't deactivate yourself, and the company always keeps one active admin. Needs the standing to give every role they hold.

decide

ChatGPT
Answer a decision: one of its choices (option_key), with a note when the choice needs one (turning something down usually does). Made on the phone, maybe offline; id is the decision's own id, so sending it again is the same decision. Whoever the decision is for may answer, as may anyone who manages work there, but never on a request they started. If the decision was cancelled meanwhile, the answer is kept and changes nothing.

decide_certification_upload

ChatGPT
Approve or turn down a certificate a worker sent in. Approving issues the certification, good through the expiry date on the certificate (correct it with expires_on if they got it wrong). Turning it down needs a note saying why. Needs certifications.manage where the person works.

discard_course_draft

ChatGPT
Throw away a course's unpublished draft. Published versions don't change. Needs content.manage where the course applies.

discard_form_draft

ChatGPT
Throw away a form's draft. The published version, if there is one, stays as it is. Needs templates.manage at the form's unit.

discard_inspection_template_draft

ChatGPT
Throw away an inspection template's draft. The published version, if there is one, stays as it is. Needs templates.manage at the template's unit.

discard_workflow_draft

ChatGPT
Throw away a workflow's draft. The published version stays. Needs workflows.manage where it applies.

drop_class_signup

ChatGPT
Take someone off a class: yourself, or someone else where you manage work. Their seat goes to the first on the wait list, who is told. Their course work stays open, so they can sign up for another class.

duplicate_form_template

ChatGPT
Start a new form as a copy of another: its questions (the draft if it has one, or else its published version), its description and its kind. The copy is its own form, with its first version as a draft, and publishes on its own; the original doesn't change. name defaults to 'Copy of' the original's. It applies at org_unit_id (left out, where the original applies). Needs to be able to read the original, and templates.manage where the copy applies. The id may be made by the caller.

edit_form_submission

ChatGPT
Change a submitted form's answers (step 4.9), when its form allows edits and you hold one of its edit roles where it was filled or above, within its time limit. base_revision is the revision you're changing (1 is the original as sent); if someone else changed it since, this is refused and you reload. answers are the whole form's answers, keyed by question; photos, videos, files, signatures and initials stay as they were given. reason says why, in words. The form's logic runs again on the version and moment it was filled, so calculations, flags and what's required stay right. The original never changes: this is a new revision. The result lists which answers changed. Needs signal: there's no offline edit.

get_inspection

ChatGPT
One inspection by id: its summary (template, asset, who, when, result), plus each step in order with its instruction, its result, any note and reading, the reviewer's comments, and where it was done.

get_me

ChatGPT
Who this connection acts as: the person (or service account), their company, the roles they hold and where, and whether this connection can make changes or only look things up. It includes the caller's own person id and the units where they hold roles.

get_passage

ChatGPT
One passage of a library document, whole, by its chunk_id from a search result: its words, the page it's on, the document's title and a link that opens the document at that page. Only documents the caller can open.

get_person

ChatGPT
One person by id: name, status, email, employee ID, the roles they hold and where, their open work and their certifications with each one's state (current, expiring, expired, revoked). Only someone the caller can see.

grade_written_answers

ChatGPT
Grade the written answers in someone else's finished course, as their supervisor: for each, the try's id, the question id, right or not, and a note for them if you like. Needs work.manage where the training was handed out. A grade is final. Once every written answer in the course's last tries is graded, the course passes or not by the quiz's pass mark, and passing completes its work.

grant_certification

ChatGPT
Grant someone a certification by hand, with a note saying why. It's issued today unless issued_on is earlier, and expires by the type's rule. Needs certifications.manage where the person works.

import_assets

ChatGPT
Add many assets from CSV text. The first row is the header. Columns: name, type (an asset type's name), org_unit (the unit's code, name or full path like "North Division > Northside Yard"), code (the company's number for it), barcode (the barcode already on it, recorded as its tag), and one column per field its type defines, headed by the field's name. Every asset type can be in one file. Each asset is added as if added one at a time: assets.manage at its unit, its fields checked against its type, a duplicate code or barcode refused in words. Rows that pass are added; rows that don't are left out and reported with their row number and the reason. QR tags aren't imported; make them after. Up to 2000 rows. To check a file without writing anything, post it to /api/import/preview first.

import_certification_history

ChatGPT
Bring certificates over from the old system, from CSV text. Columns: employee_id or email, certification (a type's name or code, or mapped), issued_on, and optionally expires_on (worked out from the type's rule if blank), number, org_unit, id and file. Needs certifications.manage where each person works, and a type that takes imported certificates. For each person and type they go in oldest first, each renewing the one before; one older than a certificate they already hold is refused. Each record is marked as brought in, with the system's name, its id there and its file, and never carries a signature. One old id from one system comes in once; sending it again is refused for that row. Rows that pass are added, rows that don't are reported with their row number and the reason. Find each person by employee_id or email. Dates like 2024-05-01 or 5/1/2024, never after today. org_unit is optional: blank puts it at the deepest place they work where it applies. mapping maps a name in the file (any case) to one of ours, for names that don't match. files maps a file name in the file column to a file uploaded separately. Up to 2000 rows.

import_org_units

ChatGPT
Add many org units from CSV text. The first row is the header. Columns: name, level (a level's name), parent (the parent unit's code, name or full path; blank puts it directly under the company), code, and one column per field the units' level defines, headed by the field's name. Parents can be defined further down the same file. Each unit is added as if added one at a time: its level must sit below its parent's, its fields are checked against its level, and a duplicate code is refused in words. Rows that pass are added; rows that don't are left out and reported with their row number and the reason, and nothing from a failed row is written. Needs the same standing as adding them one at a time. No PINs: a column that looks like a PIN or a sign-in secret refuses the whole file. Up to 2000 rows. To check a file without writing anything, post it to /api/import/preview first.

import_people

ChatGPT
Add many people from CSV text. The first row is the header. Columns: given_name, family_name, email, phone (with country code, like +19705550123), employee_id, language (en, es), user_type (a home screen's name), org_unit (a unit's code, name or full path like "North Division > Northside Yard"), role (a role's name). org_unit and role are required, and several of each can be separated with semicolons for someone who works in several places. Each person is added as if added one at a time: only roles whose permissions the caller holds at that unit, and a duplicate email, phone or employee ID is refused in words. Rows that pass are added; rows that don't are left out and reported with their row number and the reason, and nothing from a failed row is written. Needs the same standing as adding them one at a time. No PINs: a column that looks like a PIN or a sign-in secret refuses the whole file. Up to 2000 rows. To check a file without writing anything, post it to /api/import/preview first.

import_training_history

ChatGPT
Bring training records over from the old system, from CSV text. Columns: employee_id or email, course (one of ours by its title, or mapped), completed_on, and optionally passed (yes or no), score (0 to 100), org_unit, id (the old system's id) and file. Needs content.manage where each person works. The certification engine counts these only for types that take imported records. Each record is marked as brought in, with the system's name, its id there and its file, and never carries a signature. One old id from one system comes in once; sending it again is refused for that row. Rows that pass are added, rows that don't are reported with their row number and the reason. Find each person by employee_id or email. Dates like 2024-05-01 or 5/1/2024, never after today. org_unit is optional: blank puts it at the deepest place they work where it applies. mapping maps a name in the file (any case) to one of ours, for names that don't match. files maps a file name in the file column to a file uploaded separately. Up to 2000 rows.

invite_people

ChatGPT
Invite people to sign in: each gets a text if they have a mobile number and no app yet, and an email if they have an address, with the company's own words for invites. Skips anyone who has signed in already, can't be reached, or was invited in the last day, and says who and why. Up to 500 at a time. Needs people.manage where each person works.

issue_bundle

ChatGPT
Issue a learning path or routine to people: each gets their own run at the unit where they work (or org_unit_id, if given), on its current version, and the items that wait for nothing are handed out now as ordinary work. The rest unlock as what they wait for is done, handed out as you. Someone who already has an open run of it is skipped. Needs work.manage where the work will be.

list_assets

ChatGPT
Equipment, vehicles and tools the caller can see: name, code, type, where it is and whether it's in service. q matches a name or code; asset_type_id, org_unit_id (that unit and under) and status (in_service, out_of_service, retired) narrow it.

list_certifications

ChatGPT
Certifications the caller can see, by person: the certification, when it was issued and when it expires, and its state (current, expiring inside its warning days, expired, revoked, superseded by a renewal). person_id, org_unit_id (people working there and under), type_id, q (words in its name) and state narrow it. For who's expiring soon, pass state expiring.

list_company_fields

ChatGPT
The company's own fields that show in the API, on people, assets, org_units, assignments (work), form_submissions and certifications: each field's key, label, type (text, number, date, choice, pick_list, yes_no, person, asset, unit), its choices and whether it's required. Records carry their values under custom, by key.

list_corrective_actions

ChatGPT
Corrective actions the caller can see, newest first: what's wrong, its cause (a failed step, a form answer, by hand), the owner, priority (low, normal, high, urgent), due day and state. state is open, in_progress, blocked, done (fixed, waiting for sign-off), verified (signed off) or cancelled; org_unit_id (that unit and under) and owner_person_id narrow it.

list_documents

ChatGPT
The library's documents the caller can open, newest first: title, category (procedure, safety_data_sheet, manual, other), where it applies, its current version, and whether it's kept on phones. q matches words in the title, not the documents' contents.

list_form_submissions

ChatGPT
Forms filled in and sent, newest first: which form, who filled it, where, when, any flags it raised, and the answers by question key. A signature signed by someone else is {signature_id, name, title, company}. notes and extra_media are the step at the end of the form: notes about anything else, and the ids of its photos and videos. template_id, org_unit_id (that unit and under), since and until narrow it. A form edited after it was sent shows its latest answers.

list_inspections

ChatGPT
Submitted inspections the caller can see, newest first: the template, the equipment, where, who did it, when, and the result. result is fail when any step failed, concern when none failed but one raised a concern, else pass, after any change a reviewer made. result, since and until (times), org_unit_id (that unit and under), asset_id, template_id and reviewed narrow it. For failed inspections this week, pass result fail and since the start of the week.

list_org_units

ChatGPT
The company's org units the caller can see: sites, regions, crews, jobs, whatever levels the company uses, each with its level and the names above it. q matches a name or code; parent_id lists the units right under one. Each comes with its org_unit_id.

list_people

ChatGPT
People the caller can see, by name: their roles and where they hold them, email and employee ID. q matches a name, email or employee ID. org_unit_id keeps those who work at that unit or under it; role_key keeps those holding that role (worker, supervisor, admin, or the company's own). status is active unless asked: invited, deactivated, or all. Each comes with their person_id. Service accounts aren't listed.

list_report_metrics

ChatGPT
List every number the company's reports can show (work done on time, failed inspections, certification gaps, adoption and the rest), each with its key, what it counts in plain words, whether it takes a date range, and the slices it can be broken down by. Also lists the company's own slices: its levels (such as district or site) as level:<id>, its pick lists as pick_list:<id>, and its own fields marked In reports (a crew, a shirt size, a cost center) as field:<id>, with their choices. Needs reports.read at some unit.

list_report_records

ChatGPT
List the records behind a report number, given that row's drill (or the total's). Each record has its type and id (assignments, inspections, form_submissions, certifications, people and so on), what it's called, who and where, its day and state, and for a rate whether it counts as a hit. Newest first, 50 at a time; use offset for more. Opening a record still needs the right to see it.

list_roles

ChatGPT
The company's roles: key, name, kind (worker, supervisor, admin) and the permissions each carries, with its role_id.

list_templates

ChatGPT
What can be handed out, by kind: courses, forms, inspection templates, skill checks, learning paths and routines, each with its id, name and where it applies. Only published ones that aren't retired. The id is what handing out work takes as subject_id (subject_type course, form_template or inspection_template), or as the learning path or routine to issue.

list_work

ChatGPT
Work handed out (tasks, courses, forms, inspections, documents to sign, skill checks, corrective actions, decisions) the caller can see, newest first. mine keeps the caller's own; assignee_person_id someone else's; org_unit_id that unit and under. state is open, in_progress, blocked, done, verified or cancelled; overdue keeps open work past its due day. kind, due_before and q (words in the title, like a course's name) narrow it.

mark_inspection_reviewed

ChatGPT
Mark an inspection reviewed, with an optional note. It leaves the review queue. Once per inspection. Needs work.manage where it was done. The person who did the inspection can't review it.

mark_notification_read

ChatGPT
Mark one of the caller's own notifications as read. Nothing else changes, and marking it again changes nothing. A notification marked read isn't sent again as a text.

move_org_unit

ChatGPT
Move an org unit, with everything under it, to a new parent, and optionally to a different level. Everyone who works there keeps their role and gains the new chain above. Needs org.manage at the unit and at the new parent.

publish_certificate_design

ChatGPT
Publish a certificate design's draft as its next version, with the company's logo and colors as they are now. Certifications issued from then on, of types using the design, look like it; ones already issued keep the version they were issued with. Needs certifications.manage where it applies.

publish_course

ChatGPT
Publish a course's draft as its next version. From then on it's what workers take, it can be assigned, and it never changes; to change it, save a new draft and publish that. Refused if the draft has no lessons or a file in it hasn't finished uploading. Work already handed out moves to the new version; records of finished training keep the version that was taken. Needs content.manage where the course applies.

publish_form_template

ChatGPT
Publish a form's draft in Portalbase. From then on, new forms in the company's Portalbase web and phone apps are filled on this version, and the version before it is kept, unchanged, for the forms already filled on it. It can't be unpublished; a later draft can be published over it. Refused, with the problems listed, if the draft breaks a rule of the format, names a pick list the company doesn't have, or shows or attaches a library document that isn't there, doesn't apply where the form does, or isn't the kind its block says (a picture, a PDF, a video). Needs templates.manage at the form's unit.

publish_inspection_template

ChatGPT
Publish an inspection template's draft. New inspections run it from then on, phones pick it up on their next sync, and the version before it is superseded but kept for the records made with it. A draft needs at least one step. Needs templates.manage at the template's unit.

publish_pick_list

ChatGPT
Publish a pick list's draft as its current version. Published versions never change; records keep the version they were made with. Needs reference.manage.

publish_workflow

ChatGPT
Make a workflow's draft its next published version. Runs that start from now on follow it; runs already going stay on the version they started on. The caller becomes its owner, and its runs act as the caller, with the caller's permissions on the day. Publishing can't be undone, but a new draft can be published after it. Refused while the draft has problems. Needs workflows.manage where it applies.

reactivate_person

ChatGPT
Let a deactivated person sign in again, with the roles and places they had. Phones already wiped stay wiped; they sign in again on them. Needs the standing to give every role they hold.

reassign_assignment

ChatGPT
Hand open work to someone else. They're told. Whoever had it can still record what they did before it moved. Needs work.manage where the work is.

record_meter_reading

ChatGPT
Record what a meter on an asset reads: hours, miles or kilometers, whichever its asset type has, up to one decimal place. Anyone who can see the asset can, from a phone offline too; the id may be made on the phone and sending it twice records it once. A reading lower than the last one is kept and flagged, not refused. read_at is when it was read (defaults to now).

reinstate_asset

ChatGPT
Put a retired asset back in service. Needs assets.manage at its unit.

reinstate_form_template

ChatGPT
Make a retired form available again in the company's Portalbase, on its current published version: people at its unit can fill it in and it can be handed out again. It can be retired again later. Needs templates.manage at its unit.

reinstate_inspection_template

ChatGPT
Bring a retired inspection template back into use with its current published version. Needs templates.manage at its unit.

remove_asset_tag

ChatGPT
Take a tag off an asset. Scanning it finds nothing from then on. Needs assets.manage at the asset's unit.

remove_asset_type

ChatGPT
Remove an asset type so it can no longer be picked for new assets or templates. Refused while assets have it or inspection templates apply to it. Needs reference.manage.

remove_company_field

ChatGPT
Take a company field off. The values already kept stay with their records but no longer show, and a field with the same key can't be added again. Needs company.manage.

remove_dashboard

ChatGPT
Remove a dashboard. Whoever it was shared with no longer sees it, and it's no longer anyone's default. Needs to be its owner, or reports.manage for the whole company.

remove_membership

ChatGPT
End a person's role at an org unit. Their access there stops at once and their phone drops that unit's data on its next sync. Needs the standing to give that role there. The company always keeps one active admin.

remove_notification_rule

ChatGPT
Stop one interval of a kind of due or overdue notification, named by its kind and days. Needs company.manage.

remove_notification_template

ChatGPT
Go back to the built-in words for a kind of notification, in one language (en if left out). Needs company.manage.

remove_org_level

ChatGPT
Remove a level that no unit uses. The company level at the top can't be removed. Needs company.manage.

remove_org_unit

ChatGPT
Remove an org unit. It must have no units under it, nobody working there, and no shared device. Records made there keep pointing at it. Needs org.manage at the unit or above.

remove_pick_list

ChatGPT
Remove a pick list that no field uses. Records that used it keep their answers. Needs reference.manage.

remove_qr_code

ChatGPT
Take a QR code out of use. Scanning it finds nothing from then on; make a new one to print a new label. Needs what managing the thing it opens takes there.

remove_qualification_requirement

ChatGPT
Stop requiring a certification there. Needs certifications.manage at the unit.

remove_report_schedule

ChatGPT
Stop a scheduled send for good. Needs to be its owner, or reports.manage for the whole company.

remove_role

ChatGPT
Remove a role nobody holds. The built-in Admin role can't be removed. Needs company.manage.

remove_schedule

ChatGPT
Remove a schedule. It issues nothing more; work it already issued stays, to be done or cancelled like any other. Needs work.manage where it applies.

remove_workflow

ChatGPT
Remove a workflow that's turned off. Its versions and runs are kept as records. Needs workflows.manage where it applies.

rename_org_unit

ChatGPT
Rename one org unit (a site, region, crew or any level the company defines). Needs org.manage at that unit or above. The name is what everyone in the company sees.

rename_pick_list

ChatGPT
Rename a pick list. Its key, items and versions don't change. Needs reference.manage.

renew_certification

ChatGPT
Hand out the renewal of a certification nearing expiry, as its type says: a course or skill check due by the day it runs out, or a learning path. Once per certification. The certifications job runs it as the type's owner; anyone who manages work where the person works may run it too.

reopen_assignment

ChatGPT
Reopen done, verified or cancelled work, with why. It goes back to open for the same person or pool and counts as reopened on the board. Needs work.manage at its unit. The answer says applied, or kept with a note when it couldn't change anything any more (it was cancelled, someone else took it). Either way the record is kept.

resolve_certification_flag

ChatGPT
Decide on a certification flagged after a correction to the form it was earned on: keep it, or revoke it with the reason. A correction never revokes one by itself. Needs certifications.manage where the person works.

retire_asset

ChatGPT
Retire an asset that's sold, scrapped or gone. It leaves phones, its tags stop opening it for crews, and it can't take readings; its history stays. Needs assets.manage at its unit.

retire_certificate_design

ChatGPT
Retire a certificate design. Types using it issue with the standard look from then on; certifications already issued keep theirs. Needs certifications.manage where it applies.

retire_certification_type

ChatGPT
Retire a certification type. Nothing new is issued from it; certifications already issued stay. Needs certifications.manage where it applies.

retire_form_template

ChatGPT
Retire a form so it isn't offered or handed out and phones drop it. Submissions made on it keep it. Refused while open assignments still hand it out, until they're cancelled or finished. Needs templates.manage at its unit.

retire_inspection_template

ChatGPT
Retire an inspection template so it isn't offered for new inspections or handed out, and phones drop it. Records made with it keep it. Refused while open assignments still run it: cancel them or let them finish first. Needs templates.manage at its unit.

retire_shift

ChatGPT
Retire a shift. Refused while a live schedule still uses it; change or remove those schedules first. Needs org.manage where the shift is.

revoke_certification

ChatGPT
Revoke a certification, with the reason. It's no longer current; the record stays. Needs certifications.manage where the person works.

run_report

ChatGPT
Work out one report metric, by its key, as one number or sliced by up to two dimensions (time for a trend; a level, person, template, kind and so on), over a date range (default the last 30 days) and filters. The database does the math; the answer has each row's value, the counts behind it (n of d for a rate) and a drill that identifies the records behind it. Only counts records at units where the caller holds reports.read. Numbers are as of refreshed_at, a few minutes behind at most.

run_schedule

ChatGPT
Issue whatever a schedule is due to issue now: to each person or pool it applies to, for each occurrence that has come round and isn't over, once. Running it again issues nothing twice. The schedule job runs every schedule every few minutes and after changes, so this is only for now. as_of runs it as if it were that moment, up to a day back or three days ahead. Needs work.manage where it applies.

save_certificate_design

ChatGPT
Add a certificate design, or change its draft (design_id). It applies at an org unit and under it. layout is format 1: a page (letter_landscape, letter, a4_landscape, a4 or card) and up to 60 elements, each with an id and a box {x, y, w, h} in points from the top left: text (text with {tokens} like {person.name}, {certification.name}, {course.title}, {course.version}, {score}, {trainer.name}, {issued_on}, {expires_on}, {good_through}, {certificate.code} or {form.<field key>}; size, weight, align, color, caps), logo, signature (source worker, trainer or observer), qr (the public page that says whether it's current), line and frame (color, thickness). Saving changes the draft only; publishing the design makes it what's issued. Needs certifications.manage at the unit.

save_certification_type

ChatGPT
Add a certification type, or change one (type_id). It applies at an org unit and under it. earned_by is the list of what earns it, all needed: a course (kind course, subject_id the course), a learning path (learning_path, the bundle), a skill check (skill_check, the template), or a form answer (form, the template, field_key and the answer value); a group {kind: any, of: [...]} counts as one requirement met by any of them. Leave it empty for a type only granted by hand or from a certificate a worker sends in (accepts_uploads). expiry is never, after a count of days, weeks, months or years, end_of_month after a count of months or years, or fixed on a month and day each year. warn_days is when it shows as expiring. renewal, if set, is what renews it and is handed out lead_days before it expires, due due_days_before it. design_id is the certificate design it's issued with (published, applying at or above the unit); none means the standard look. Needs certifications.manage at the unit. Saving makes you its owner, which the renewals it hands out act as.

save_company_field

ChatGPT
Add a company field to a kind of record (people, assets, org_units, assignments, form_submissions, certifications), or change one. A field has a key that never changes, a label, a type (text, number, date, choice, pick_list, yes_no, person, asset, unit) that never changes, and choices or a pick list where its type needs one. on_phones decides whether phones carry it (off unless a crew needs it). shows lists where it appears: forms, filters, reports, exports, api. Left out, everywhere but reports: in reports, its values are seen by anyone with Reports access where the record is, so it's added only when asked for. Needs company.manage.

save_course_draft

ChatGPT
Save a course's draft: its title, summary, sign-off settings and its lessons, in order, replacing the lessons the draft had. If the course has no draft, this starts one, so it's also how to edit a published course: the published version stays as it is until the draft is published. Lessons: text (body), video (media_id of an uploaded video), document (media_id of an uploaded PDF, or document_version_id of a library document version), quiz (pass_percent; questions, each one of single, multiple, true_false, order, match, fill_blank, hotspot or written with its key; and optionally draw, shuffle, max_tries, show_answers and exam) or checklist (items, each required or not), or page (blocks, in order: text with headings, bullets, numbered steps and bold; callout with tone tip, warning or stop; image (media_id of an uploaded JPEG or PNG, caption, alt); video (media_id); document (media_id of an uploaded PDF or document_version_id of a library document); checklist (items); acknowledge (a statement the worker ticks)). modules group the lessons: each lesson's module_id names one, and each module's lessons come together, in the modules' order. Each lesson is a step: required (the default) or optional, which a worker can leave undone and which doesn't count toward whether they passed. step_order is in_order (each step opens once the required ones before it are done) or any_order. A lesson's id keeps it the same lesson from one save of the draft to the next; the answer maps each lesson to its id. An exam quiz is graded on the server only: its keys are kept apart and never reach a phone. A hotspot question's photo is uploaded first like a video, as a JPEG or PNG. Quiz, choice and item ids are short lowercase names you choose. feedback is the end-of-course survey: up to five questions, each a 1 to 5 rating or words; null for none. allows_group lets a leader run it for a group on one phone or tablet, each person adding themselves and signing (off by default); a course with an exam can't, since an exam needs signal for each person. requires_class makes it a course done only in a class: nobody takes it on their own, and it's recorded when a class's attendance is taken as a group session (so it needs allows_group too). Needs content.manage where the course applies.

save_form_draft

ChatGPT
Save the definition of a form's next version as a draft, replacing any draft already there. Nothing changes for crews until it's published, and the published version never changes. The result lists what would stop it publishing (problems, as path:code), empty when it's ready. Needs templates.manage at the form's unit. The definition is format 1 JSON (packages/forms/README.md): sections of fields, each field {key, type, label} plus what its type takes. A choice has options [{key, label, outcome?}] where outcome pass, concern or fail flags the answer for review. A pick_list field names a company pick list by pick_list_key. Make a section or question site-specific with visible_when {op: 'at_unit', args: [{value: '<unit id>'}]}. A draft can be saved with problems in it; the result lists them, and publishing is refused until there are none.

save_inspection_template_draft

ChatGPT
Save the steps of an inspection template's next version as a draft, replacing any draft already there. Nothing changes for crews until it's published, and the published version never changes. To change a step, keep its id; to drop one, leave it out. requires_asset_scan true makes the worker scan the asset's tag before starting, which proves they were at it. Needs templates.manage at the template's unit. Steps are a list in the order the worker runs them, each {id, title, instruction, evidence, results}: id is a UUID you make for a new step and keep when the step carries into a later version; the instruction says what to do and what right looks like, and is read aloud while the worker records; evidence is video, photo, reading or note; results is any of pass, concern and fail. Optional: critical true (needs a fail result; a fail can take the asset out of service), and for a reading step reading_unit (required, like psi or hours) with reading_min and reading_max.

save_notification_template

ChatGPT
Save the company's own words for a kind of notification: work.due_soon, work.overdue or work.overdue_supervisor. title and body may use {{tokens}} from the kind's fields: work.title, work.kind, work.unit, work.when, work.assignee, work.handed_to, person.first_name, person.name, company.name. text is the short form for texts (left out, it's built from the title and body). link is a page in the app. A template with a token the kind doesn't have is refused. language defaults to en. enabled false keeps it but uses the built-in words. Needs company.manage.

save_pick_list_draft

ChatGPT
Save the next version of a pick list as a draft, replacing any draft already there. Nothing changes for anyone until it's published. To retire an item, keep it with active false: records that used it still show its label. An item can name a parent: the key of the item it sits under in another list (a pump under its sump), so a form can offer only the items under what was picked there. Needs reference.manage.

save_workflow_draft

ChatGPT
Replace a workflow's draft with these steps. The published version, and runs already going, don't change, and nobody is affected until a draft is published. Saving again replaces it. A draft can have problems; it can't be published until it has none. Needs workflows.manage where it applies. definition is the workflow as JSON, format 1: a trigger (an event topic with an optional condition, or by hand with the roles who may start it), the step it starts at, and its steps, each with a key, a type, a title and where it goes next. Problems come back in words.

schedule_report

ChatGPT
Email a Reports tab as a PDF on a schedule: weekly on a day (1 Monday to 7 Sunday) or monthly on a date (1 to 28), at an hour (0 to 23) on the company's clock. It goes to the people named and whoever holds the roles named, each getting the tab as their own Reports shows it (nothing, if they can't open it). The page filters are kept; dates like "last 7 days" move with each send. Needs reports.read. The id may be made by the caller.

search_documents

ChatGPT
Search the company's library (procedures, safety data sheets, manuals) by the words of a question, and by meaning when the search service is reachable. Returns the documents that match, best first, each with up to three passages: the exact words and the page they're on. Only documents the caller can open are searched. Each passage has a chunk_id that identifies it.

send_announcement

ChatGPT
Send an announcement to everyone at an org unit and under it, or only those with some roles there (role_ids). A title and the words, and optionally a photo, video or document uploaded separately. send_at sends it later (left out, now). pinned_until keeps it at the top of everyone's app until that day. urgent sends it through quiet hours, and texts anyone who doesn't open the push. ack_statement makes it need each person's acknowledgment: they get work in their Tasks that closes when they sign that statement, due ack_due_on if given. Each person's read is recorded. Needs work.manage at the unit, or company.manage. The id may be made by the caller. It's the send_announcement command of the Portalbase API (https://portalbaseai.com/api/v1/openapi.json).

send_back_corrective_action

ChatGPT
Send a corrective action's fix back to its owner, with why (reason): the fix isn't good enough, or the photos don't show it. It's open again; the owner sees the reason and is told. Works on one waiting for a sign-off, or one already closed. Needs work.manage where it's fixed. id is this event's own id.

send_notification

ChatGPT
Tell someone something: to one person (person_id), or to everyone with a role at a unit and the units under it (role_id and org_unit_id). It lands in their Notifications list, and goes by push, text and email per channels (all three if left out) and each person's own switches. urgent goes through quiet hours, and an urgent push nobody opens becomes a text. Needs work.manage where each person works, or company.manage. The notification records who sent it. It's the send_notification command of the Portalbase API (https://portalbaseai.com/api/v1/openapi.json).

send_survey

ChatGPT
Send a published survey to everyone working at org_unit_ids and under them (only holders of role_ids, if any are listed). Each person gets it once, as form work due on the survey's close date, at the site or crew they work at, which is what the response rate is counted by. People who already have it are skipped. Refused if the survey has no close date or it's past. Needs work.manage at each unit. The result says how many got it and how many already had it.

set_asset_release_steps

ChatGPT
Set the sign-offs that return an asset type to service, in order (up to 6): each with a label (for example Mechanic, then Driver), the role whose holders sign it (or none, for anyone who manages the asset or its work there), and the attestation text they put their name to. An empty list means one sign-off. Assets already out of service keep the steps they started with. Needs reference.manage.

set_assistant_settings

ChatGPT
Set what the assistant says first when someone may be hurt or in danger: the company's own words for who to call, up to 500 characters, like "Call 911. Then call the safety lead at 555-0142." null goes back to "call 911, then tell your supervisor". Needs company.manage.

set_branding

ChatGPT
Set the company's colors and its words for things. Colors are hex like #c2410c; null goes back to Portalbase's. Labels replace words across the apps, for example {"site": "Job site", "tasks": "Work orders"}; an empty string goes back to the default word. Fields left out don't change. Needs company.manage.

set_capture_settings

ChatGPT
Set how inspections are captured for the whole company: the instruction layout (card: a full-screen card before recording, read aloud during it; band: beside the preview, not available until Portalbase clears it), the longest clip per step (10 to 600 seconds), the most video per inspection (60 to 3600 seconds), and the recording resolution (720 or 1080), and whether phones hold videos until they're on Wi-Fi (photos always go), and who records skill checks (supervisor: someone who manages work where it's done records the worker, the default; worker: the worker records themselves; either). Fields left out stay as they are. Needs company.manage.

set_certification_alerts

ChatGPT
Set the days before expiry when the person and their supervisors are told a certification is running out, like 60, 30 and 7. Needs certifications.manage at the company's top unit.

set_certification_award

ChatGPT
Say a course or a learning path earns a certification type, or no longer does (on false). Adds or removes just that one requirement in what earns it (earned_by); everything else stays. If the type needs other things too, all are still needed. Unlike saving the type, it doesn't change who owns its renewals. Needs certifications.manage where the type applies.

set_custom_fields

ChatGPT
Set the company fields on one record, by key: { key: value } with null to clear one. Fields left out keep what they had. Each value is checked against its field. For people it needs people.manage where they work; for assets assets.manage, for org_units org.manage, for assignments work.manage, for certifications certifications.manage, where the record is. A form record's fields are set when it's sent and don't change after.

set_group_settings

ChatGPT
Choose how people are added on a leader's device, for group sessions, a form the crew signs and a skill check's worker signing on the recorder's phone. group_id_only_allowed: take an employee ID typed alone, with nothing else checked (never for a skill check). group_sessions_on_personal_phones: let leaders add people on their own phones, with badges checked on the phone and PINs sealed and checked at sync, and on the web, where a PIN is checked as it's typed (step 4.10); shared tablets always can. Fields left out don't change. Needs company.manage.

set_home_tiles

ChatGPT
Replace the home screen tiles for one user type with this list, in this order. Each tile opens one feature (tasks, training, sops, inspections, forms, certs, ask, announcements, report_issue, reports, requests, shift), or, for feature link, an https URL with a label, or, for feature extension, one of the company's extensions (extension_id) with a label, or, for feature form, one published form (form_template_id), opened ready to fill; its label defaults to the form's name. A label overrides the feature's name for this tile only. Needs company.manage. Up to 24 tiles; four to eight read best on a phone.

set_my_language

ChatGPT
Pick the language your own app shows you: en (English) or es (Spanish). The web and the phone show every screen in it from then on, and notifications to you are written in it where the company has words for it. Only for a person signed in as themselves, not a shared device.

set_my_notifications

ChatGPT
Turn push, text or email on or off for your own notifications, and set your own quiet hours (start and end like 21:00, on your phone's clock; the same start and end for none, only where your company lets people shorten theirs; null for the company's). Your quiet hours can be longer than the company's but not shorter unless it allows that. Leave one out to keep it. Only for a person signed in as themselves, not a shared device.

set_notification_rule

ChatGPT
Set when one kind of due or overdue notification goes out at one interval, and on which channels, for the whole company. Kinds: due_soon (a reminder to the person it's handed to, days before the day it's due), overdue (to them, days after the day it was due), overdue_supervisor (to whoever manages work at the nearest unit above it, days after). Kind and days together name the row: a new pair adds another interval (a reminder 3 days and 1 day before), an existing pair is changed. send_hour is the hour it goes out, 0 to 23, on the work's own clock. Channels: push to phones with the app, text only to people without it, email to people with an address. fallback_text: a push nobody opens becomes a text after the company's minutes. Needs company.manage.

set_notification_settings

ChatGPT
Set the company's quiet hours (pushes and texts wait from start until end on each person's clock, unless urgent; email and the Notifications list never wait; null for none), whether people may shorten them on their profile (they can always widen them), and after how many minutes an unopened push becomes a text where the rule says so (null for never). Leave one out to keep it. Needs company.manage.

set_org_unit_time_zone

ChatGPT
Set the time zone an org unit runs on, as an IANA name like America/Denver, or null so it takes the one from the unit above it. The company's top unit always has one; it's the company's default. Schedules, shifts and due days there run on this clock. Needs org.manage at the unit.

set_person_user_type

ChatGPT
Choose which user type, and so which home screen, a person gets. Null puts them back on the company's default. Needs people.manage where the person works.

set_qualification_requirement

ChatGPT
Require a certification for a role at an org unit and under it (or for everyone there, with no role), from a date. Supervisors there see who isn't current before handing out work. Needs certifications.manage at the unit.

set_schedule_active

ChatGPT
Pause a schedule (active false), so it issues nothing, or start it again (active true). Who it acts as doesn't change. Needs work.manage where it applies.

set_shift_settings

ChatGPT
Set a Shift form's settings (a form of kind handover). Where it runs, one area per unit: unit_ids picked under the form's unit, or every unit of level_id under it, or with neither the form's own unit. sign_role_ids sign the exam and ack_role_ids acknowledge it, holding the role where the area is or above (none: anyone who works there). ack_first: the incoming shift acknowledges before adding to the log. pool_open: open findings go straight into the area's pool as tasks, for pool_role_id if set. log_off_unit_ids: areas with the running log off, where only someone who can sign adds findings and the exam is the record. Fields left out stay as they are. Needs templates.manage at the form's unit.

set_workflow_active

ChatGPT
Turn a workflow on or off. On: from now on it starts a run for each matching event, or when someone starts it by hand, and each run hands out work and sends notifications to the company's own people as its steps say; the caller becomes its owner. Off: nothing new starts, and runs already going carry on. It can be turned on or off again at any time. Needs a published version to turn on, and workflows.manage where it applies.

share_dashboard

ChatGPT
Say who sees a dashboard or a prebuilt tab, replacing who saw it before: everyone with Reports access (everyone), roles (whoever holds the role anywhere), and people. default makes it the tab Reports opens on for everyone, or for a role; it stops being any other dashboard's default for them. Someone with no Reports access sees a shared dashboard counted over the places they belong to, and nothing else; a prebuilt tab is for people with Reports access, so copy it to share it with others. Shared with no one, a prebuilt tab is hidden from everyone but reports.manage. Needs reports.manage for the whole company.

sign_up_for_class

ChatGPT
Sign someone up for a class: yourself, or someone else where you manage work. It's for the course work they've been handed for that course; if someone else has none yet and you manage work there, it's handed out first, due the day of the class. The server gives a seat if one is free, else the next place on the wait list, and says which. The id is the sign-up's, made on the phone; sending it again signs up once.

start_assignment

ChatGPT
Start an assignment you have, or one in your pool (which claims it). The answer says applied, or kept with a note when it couldn't change anything any more (it was cancelled, someone else took it). Either way the record is kept.

start_workflow

ChatGPT
Start one run of a workflow that's started by hand, at a unit it applies at, with a note saying what it's for (some need one). The run hands out work and sends notifications to the company's own people as the workflow's steps say, acting as the workflow's owner. A run can be cancelled, but notifications it sent stay sent. Anyone holding one of the roles the workflow names there may start it, as may anyone who manages work there. A run started from a record (an asset, an inspection, a corrective action, a filled form) names it in record and runs where it is. id is the run's id, so sending it again is the same run.

take_asset_out_of_service

ChatGPT
Take an asset out of service, with the reason. It can't be inspected again until its repairs are closed and its release is signed, in its asset type's order. Needs assets.manage or work.manage where the asset is. A failed critical step on an inspection does this on its own.

unblock_assignment

ChatGPT
Clear a block. It goes back to started if it was started, otherwise to open. The answer says applied, or kept with a note when it couldn't change anything any more (it was cancelled, someone else took it). Either way the record is kept.

update_asset

ChatGPT
Change an asset: its name, its code, its fields, its type, or the org unit it sits at (moving it takes assets.manage at both units). Fields left out stay as they are; attributes replaces the whole set. attributes are the fields its asset type defines, by key, checked against the type. Needs assets.manage at its unit.

update_asset_type

ChatGPT
Rename an asset type, replace its list of fields, or replace the meters its assets carry (hours, miles, kilometers). Readings already taken stay. Needs reference.manage. Fields are a list of {key, label, type} where type is text, integer, number, boolean, date or pick_list, with optional required, min, max, max_length, and pick_list_key for a pick_list field.

update_bundle

ChatGPT
Rename a learning path or routine, change its description, or save a new list of items as its next version. Runs already issued stay on their version. items is the whole list, in order: each has a key (lowercase, unique in the list), a kind (course, skill_check, inspection, form, task, acknowledgment), a title, and for a course its course (subject_type course), for an inspection or skill check its template (subject_type inspection_template), for a form its form (subject_type form_template), published where the bundle applies. Each is required unless it has required false, which makes it optional. after lists keys of items before it that have to be done first; a cancelled one counts as waived. due_days is days to do it once it's handed out. Fields left out don't change. Needs content.manage or work.manage where it applies.

update_dashboard

ChatGPT
Change a dashboard: its title, its line under the title, or its widgets. widgets, when given, is the whole grid in order: widgets keep their ids, new ones get one, and any left out are taken off. Needs to be the dashboard's owner, or reports.manage for the whole company. A prebuilt tab can't be changed, but it can be copied into a new dashboard.

update_form_core

ChatGPT
Put a locked core on a form, or move it to the core's newest version. A core is the part of a regulated kind of form a rule needs (workplace_exam: a Shift form's workplace exam): questions the company can add around but not remove, rename or change. The form's draft, or a new one from its published version, gets the core's questions put back as the core has them, in their own sections; publish it to use them. core null takes the core off, only before the form's first publish. The result lists what would stop the draft publishing. Needs templates.manage at the form's unit.

update_form_template

ChatGPT
Rename a form, change its description, or move it to another org unit (it then applies there and under it). Its kind can change only before its first publish, and so can whether a survey is anonymous. A survey's close date (closes_on) can move any time; work already sent stays due on the old one. Edits after submission: edits_allowed lets people holding edit_role_ids, where a form was filled or above it, change its answers with a reason, for edit_within_days days after it was sent (null: no limit). Off by default; an anonymous form or survey can't allow them. Its versions don't change. Fields left out stay as they are. Needs templates.manage at its unit, and at the new unit when moving it.

update_inspection_template

ChatGPT
Rename an inspection template, change its description, move it to another org unit (it then applies there and under it), or replace the list of asset types it applies to. For a skill check template, valid_months sets how long a pass is good for from now on (null: it doesn't expire). Its steps and versions don't change. Fields left out stay as they are. Needs templates.manage at its unit, and at the new unit when moving it.

update_org_level

ChatGPT
Rename a level, or replace its list of fields. Removing a field removes its values from every unit at that level. A field that already has values can't change type, though a new field can be added. A new required field applies the next time each unit is edited. Needs company.manage. Fields are a list of {key, label, type} where type is text, integer, number, boolean, date or pick_list, with optional required, min, max, max_length, and pick_list_key for a pick_list field.

update_org_unit

ChatGPT
Change an org unit's name, code, field values or status (active or inactive). Attributes replace the unit's values as a whole, keyed by the level's field keys. Needs org.manage at the unit or above.

update_person

ChatGPT
Change a person's name, email, mobile phone, employee ID, language or hire date. Fields left out don't change; null clears an email, phone, employee ID or hire date. Needs the standing to give every role the person holds, where they hold it.

update_repair

ChatGPT
Give a repair an owner, or mark it open or being worked on. Closing it is a separate step. Needs assets.manage or work.manage where the asset is, or owning the repair.

update_report_schedule

ChatGPT
Change a scheduled send: when, to whom, its filters or title, or pause it (paused: true) and start it again (paused: false). Needs to be its owner, or reports.manage for the whole company.

update_role

ChatGPT
Rename a role, change its kind, or replace its permissions. Applies at once to everyone who holds it. The built-in Admin role always has every permission. Needs company.manage.

update_schedule

ChatGPT
Replace what a schedule does: every field of its what, who and when, as when a schedule is added. From then on it acts as you. Work it already issued stays as it is. Needs work.manage where it applies. Who: target each_person gives everyone working at the unit or under it their own (only holders of role_ids if any are listed, and only people who started on or after starts_on if new_hires_only); target pool puts one in the pool of each unit at pool_level_id under it (or of the unit itself), claimable by holders of pool_role_id if set. When: cadence once (due due_days after they start, by hire date or the day they were added) or repeat (the same, then again repeat_every repeat_unit after the last is done, issued lead_days early) for each person; daily on days_of_week (1 Monday to 7 Sunday), weekly on one day, monthly on day_of_month, each due that day or in a window from window_start for window_minutes; or shift, every start of shift_ids, due within the shift (each unit gets the shifts at, above or under it that reach it); or dates, every year on each of dates (MM-DD, up to 12) for each person, going out lead_days early and due due_days after the date. Days and times are on the unit's clock. Work goes out at midnight where the work is on the day it falls. kind is the assignment kind; a course schedule can name its course (subject_type course) and an inspection schedule its template (subject_type inspection_template), which have to be published where the schedule applies. kind bundle hands out a learning path or routine instead (subject_type bundle, its id), as a run for each person: every week for a weekly routine, once or on repeat for a learning path; its items carry their own due days.

update_shift

ChatGPT
Change a shift's name, start and end times, the days it starts on, or whether unfinished pool work carries to the next shift. Work already issued for it keeps the times it went out with. Fields left out don't change. Needs org.manage where the shift is.

update_user_type

ChatGPT
Rename a user type, change its description, or make it the default (the one people get until someone picks another for them). Needs company.manage.

update_workflow

ChatGPT
Rename a workflow or change its description. Needs workflows.manage where it applies.

verify_assignment

ChatGPT
Verify done work that needs a supervisor's verification to close. Needs work.manage at its unit. The answer says applied, or kept with a note when it couldn't change anything any more (it was cancelled, someone else took it). Either way the record is kept.

add_membership

Claude

cancel_assignment

Claude

check_qualifications

Claude

comment_on_inspection

Claude

complete_assignment

Claude

create_assignment

Claude

create_corrective_action

Claude

create_person

Claude

describe_command

Claude

find_commands

Claude

get_inspection

Claude

get_me

Claude

get_passage

Claude

get_person

Claude

grant_certification

Claude

issue_bundle

Claude

list_assets

Claude

list_certifications

Claude

list_company_fields

Claude

list_corrective_actions

Claude

list_documents

Claude

list_form_submissions

Claude

list_inspections

Claude

list_org_units

Claude

list_people

Claude

list_report_metrics

Claude

list_report_records

Claude

list_roles

Claude

list_templates

Claude

list_work

Claude

mark_inspection_reviewed

Claude

reassign_assignment

Claude

record_meter_reading

Claude

run_command

Claude

run_report

Claude

search_documents

Claude

send_announcement

Claude

send_notification

Claude

start_workflow

Claude

take_asset_out_of_service

Claude

update_person

Claude

Capabilities

Writes

Example Prompts

Click any prompt to copy it.

Similar Apps