Every tool the 1099Policy MCP server offers, with what it takes, what it returns, and the REST endpoint behind it. For connecting and approving an assistant, see MCP server; for what to do when something does not work, see troubleshooting.
How answers are built
The tools are written so that an assistant cannot easily mislead you about insurance. These behaviours are worth knowing:
- A page is not the account. A list's counts cover every match, but its rows are one page. When a result carries
nextOffset, more rows remain, and the assistant fetches them before answering a count or an absence; a contractor missing from one page is not a contractor without coverage. - Whole-account questions have their own tool. Who has no coverage? is answered by
findCoverageGaps, which sweeps every contractor, policy, and quote and matches them itself, rather than by comparing two lists by hand.checkCoverageanswers for one named contractor. The sweep counts 1099Policy policies: a contractor insured through their own approved certificate is listed as having no policy — ask about that person and the assistant reads the certificate. - Coverage is traced policy → quote → contractor. A policy does not name its contractor directly; the quote it was bound from does. Assignments are a different relationship and are not used to decide who is covered.
- Active follows 1099Policy, not the calendar. A policy is active until it is cancelled. The expiration date on a policy is shown for reference and is never used to decide whether coverage is current.
- Dates are given to you readable. Every date field comes with a
*Readabletwin (expirationDateReadable: "2027-07-10"), so nothing has to convert a timestamp in its head. - An estimate is a price in dollars.
estimatePremiumreturns the estimated premium for the job, taxes and fees included, with the wage it is based on; the assistant says it as "$X in premium based on $Y in wages" and does not quote rates. The figure is non-binding, subject to eligibility and to 1099Policy's confirmation. When the premium cannot be worked out yet, the assistant says so instead of guessing. For an hourly job the wage is one hour's pay, so the premium shown prices that hour; the premium follows the hours billed each pay period. - A write is done when the API says so.
bindAssignmentreturnsbound,cancelAssignmentreturnscancelled; when either is false the record was created but coverage was not bound or not ended, and thenotesays why. - Binding attaches, it does not buy. A contractor with an active policy is bound with
bindAssignment; a contractor with none is sent an application link withcreateInsuranceApplicationLink, enrols, and only then can be bound. - Contact details come back only when asked for. Contractor phone numbers are never returned, and contractor email addresses only when you ask for them.
- Ambiguity is a question, not a guess. Two contractors with the same name, a missing date, a category code the account has not configured — the assistant tells you what is missing rather than inventing it.
Tool reference
Thirty-six tools, one per action: 25 that read, and 11 offered only on connections approved for Make changes. Read tools run without confirmation. Write tools are served only to connections approved for Make changes (or to an API key with write permission) and are annotated so the client confirms before running them.
Five of them are not offered in ChatGPT, under OpenAI's rules. bindAssignment, extendAssignment and createInsuranceApplicationLink each lead to a charge (a premium invoiced, or a contractor sent to buy coverage), and OpenAI allows purchases in ChatGPT only for physical goods. analyzeContract makes an automated legal determination about a worker's status, and listClassificationStates only serves analyzeContract. Claude, Cursor and every other client get all thirty-six.
Each tool is a thin wrapper over one or two REST endpoints, listed under Backed by; paths are relative to https://api.1099policy.com/api/v1. The API reference is the source of truth for each endpoint's full parameters, response shape, and errors. The descriptions and inputs below are the tool's own text, the same text the assistant reads.
The server also tells every client, at connect time, how to use the tools without misleading you — the rules in How answers are built — and publishes seven ready-made prompts (coverage gaps, applications to chase, a contractor against an entity's requirements, a premium estimate, a certificate review, a certificate the user attached, a contract the user attached) that clients supporting MCP prompts list alongside the tools.
Coverage
checkCoverage — Check a contractor's coverage
Check whether one contractor holds active insurance coverage, and of which coverage types. For questions such as whether a named contractor has active workers' compensation or general liability. Takes the contractor's id; returns their policies with coverage types and dates.
- Access: Read
- Backed by:
GET /contractors/{id}/policies; coverage types are read from each policy's quote. - Inputs:
contractor(required) — Contractor public id (cn_…) whose coverage to check.coverageType— Optional filter: only report policies that include this coverage type. One of:workers-comp,general,professional,media,cyber.activeOnly— When true (default), drop inactive (cancelled) policies from the result. Defaulttrue.limit— Maximum number of policies to return (1-100). Default25.
- Returns:
hasActiveCoverage,count, andpolicies[]— each with its coverage types and effective/expiration dates (with*Readabletwins).
findCoverageGaps — Find contractors without active coverage
Count the account's contractors with and without an active policy and list, by id and name, the ones without one. For questions about coverage across the whole account, such as who has no active coverage or how many contractors are covered. Reads every page of contractors, policies and quotes; the result says when a size bound cut the read short.
- Access: Read
- Backed by:
GET /policies,GET /quotes,GET /contractors— every page of each. - Inputs:
includeCovered— Also list the covered contractors, not just the counts. Defaultfalse.maxRecords— Safety bound per collection swept. The result reports whether it was hit. Default1000.
- Returns:
totalContractors,coveredCount,uncoveredCount, theuncovered[]list (id, name),covered[]when asked for, andcomplete— false only if the safety bound was hit. Counts 1099Policy policies; a contractor insured through their own approved certificate appears inuncovered(see How answers are built).
showCoverageChart — Show coverage as a chart
Show the account's coverage as a chart in the conversation: the share of contractors holding an active policy, how many have none, and the names of up to ten of those. For a request to see coverage as a chart or picture. The same figures also come back as text.
- Access: Read
- Backed by:
GET /policies,GET /quotes,GET /contractors— every page of each. - Inputs:
maxRecords— Safety bound per collection swept. The chart reports whether it was hit. Default1000.
- Returns: the chart in the conversation, and the same figures as text: the share of contractors with an active policy, how many have none, up to ten of their names, and whether the safety bound was hit.
listActivePolicies — List active policies
List the account's active insurance policies, each with the id of the contractor it covers, its coverage types and its effective and expiration dates. includeInactive adds cancelled policies.
- Access: Read
- Backed by:
GET /policies; coverage types are read from each policy's quote. - Inputs:
includeInactive— When true, also include inactive (cancelled) policies. Defaultfalse.limit— Max policy rows in the response (1-100). Counts cover every match. Default25.offset— Matching policies to skip before the rows start; a previous result's nextOffset. Default0.
- Returns:
count(every match),nextOffsetwhen more remain, andpolicies[]with the contractor each covers, coverage types, and dates.
Certificates
getIssuedCertificate — Get the certificate issued for an assignment
Get the download links for the certificate of insurance that 1099Policy issued when an assignment's coverage was bound. Returns no links and a pending note while the certificate is still being produced.
- Access: Read
- Backed by:
GET /assignments/{id}→GET /policies/{id}. There is no issue endpoint: the certificate is produced by binding and this tool reads back the links. - Inputs:
assignment(required) — Assignment public id (an_…) whose COI you want.
- Returns:
ready,coiPdfUrl(the signed download link) andcoiUrlsper coverage type, or anotewhen the certificate is not yet issued.
getUploadedCertificate — Get an uploaded certificate
Get one certificate of insurance that a contractor provided, by its id, with its review: the status, how many requirement rules passed, and each failed rule with the reason. The review runs asynchronously; the status says whether it has finished.
- Access: Read
- Backed by:
GET /files/certificates/{id}?expand[]=review_results - Inputs:
certificate(required) — Certificate public id (ci_…) from listUploadedCertificates.
- Returns:
status,settled,source,pdfUrl(null when the certificate was filed from a chat),summary(how many rules passed and failed) andfailed[]— each failed rule with its reason. Anotesays when the review has not finished, and when no file is on record.
listUploadedCertificates — List uploaded certificates
List certificates of insurance that contractors provided, with each one's review status and how many requirement rules passed and failed. Can be filtered by contractor and by review status, such as flagged or approved.
- Access: Read
- Backed by:
GET /files/certificates(expandingreview_results) - Inputs:
contractor— Optional. Only certificates for this contractor (cn_…).status— Optional. Only certificates whose review is in this state: flagged (failed one or more rules), approved, denied, pending, processing, in_review or error. One of:pending,processing,in_review,flagged,approved,denied,error.limit— Max certificate rows in the response (1-100). Counts cover every match. Default25.offset— Matching certificates to skip before the rows start; a previous result's nextOffset. Default0.
- Returns:
count(every match),nextOffsetwhen more remain, andcertificates[]withstatus,source,pdfUrland the passed and failed rule counts (summary).
reviewCertificate — Check a certificate against requirements
Check a certificate of insurance the user shared (PDF or image) against the account's insurance requirement, without saving anything. Takes the fields as printed on the certificate. Returns each rule with pass or fail and the reason, and missing: questions about what the certificate does not show; calling again with the answers completes the check.
- Access: Read
- Backed by:
POST /files/certificates/evaluate(stores nothing) - Inputs:
certificate(required) — The fields read off the certificate. Copy what is printed; leave out what is not there.contractor— Optional. The contractor (cn_…) the certificate belongs to; when given, the insured name on the certificate is checked against the contractor's name.requirement— Optional. The insurance requirement (ir_… from listInsuranceRequirements) to review against. When omitted, the account's default requirement is used.entity— Optional. Review against the requirement tied to this entity (en_…).
- Returns:
verdict(approved or flagged as things stand),complete,summary,results[]with each rule's pass or fail and the reason,missing[]— the questions to ask for what the certificate does not show — and therequirementapplied. Nothing is stored.
submitCertificate — Save a certificate to a contractor's record (writes)
Save a contractor's certificate of insurance to their record from the fields read off it, and review it against the account's insurance requirement. Stores the fields, not the file. A certificate that fails a rule is saved as flagged. For when the user asks to put a certificate on record.
- Access: Write — requires a connection approved for Make changes; the assistant confirms before running it.
- Backed by:
POST /files/certificates - Inputs:
contractor(required) — Contractor public id (cn_…) the certificate belongs to.certificate(required) — The fields read off the certificate. Copy what is printed; leave out what is not there.fileName— Optional. The name of the file the user shared, e.g. acme_coi.pdf.userProvided— Optional. Field paths whose values the user supplied in conversation and that are not shown on the certificate, e.g. coverages.workers_compensation.policy_expiration_date.requirement— Optional. The insurance requirement (ir_… from listInsuranceRequirements) to review against. When omitted, the account's default requirement is used.entity— Optional. Review against the requirement tied to this entity (en_…).
- Returns:
id,status(pendinguntil the review finishes),sourceassistant, and anote: the review runs in the background — read the outcome withgetUploadedCertificate. No file is stored; the certificate's fields are, with who supplied each.
openCertificateUpload — Upload a certificate PDF (writes)
Show a drop zone in the conversation where the user can drop a contractor's certificate of insurance as a PDF. A dropped file is uploaded to 1099Policy, stored on that contractor's record and reviewed against the account's insurance requirement, and the card shows the review. For when the user wants a certificate file put on a contractor's record. Takes the contractor's id. Opening the drop zone changes nothing; the upload happens only when the user drops a file.
- Access: Offered only on connections approved for Make changes, because a dropped file is filed on the contractor's record. Opening the drop zone changes nothing.
- Backed by:
POST /files/certificates(the PDF), thenGET /files/certificates/{id}for the review - Inputs:
contractor(required) — Contractor public id (cn_…) the certificate belongs to.contractorName— The contractor's name, shown on the drop zone.
- Returns: the drop zone in the conversation; once the file is uploaded, the review: approved or flagged, how many rules passed, and each failed rule. In clients that cannot show the drop zone,
reviewCertificatechecks the fields read off the certificate instead.
listInsuranceRequirements — List insurance requirements
List the account's insurance requirements: the coverage types and limits a contractor's certificate must show, the boxes that must be marked, and which requirement is the default. reviewCertificate and submitCertificate use the default unless you pass requirement or entity.
- Access: Read
- Backed by:
GET /insurance_requirements - Inputs: none.
- Returns:
count,default, andrequirements[], each with itsrules[](path,condition,value).
Contractors
listContractors — List or find contractors
List the contractors on the account, or find them by id, email, person's name or business name. Returns each contractor's id, name, business name and work state; email only when includeEmail is set. The id is what the other contractor tools take.
- Access: Read
- Backed by:
GET /contractors - Inputs:
query— Optional. Find contractors by public id (cn_…), email, the person's name, or their business name (case-insensitive; with several words, every word must appear).limit— Max contractor rows in the response (1-100). Counts cover every match. Default25.offset— Matching contractors to skip before the rows start; a previous result's nextOffset. Default0.includeEmail— Include each contractor's email address. For a request about contacting a contractor or about their email itself; names and ids identify them otherwise. Defaultfalse.
- Returns:
count(every match),nextOffsetwhen more remain, andcontractors[](id, name, company, state, and email whenincludeEmailis set).
createContractor — Create a contractor (writes)
Add a contractor to the account with their name, email and residence address. Creates a real contractor record and returns its id.
- Access: Write — requires a connection approved for Make changes; the assistant confirms before running it.
- Backed by:
POST /contractors - Inputs:
firstName(required) — Contractor's first name.lastName(required) — Contractor's last name.email(required) — Contractor's email address.address(required) — Contractor's residence address:line1,line2(optional),locality(city),region(state, e.g.CA),postalcode, andcountry(ISO code, defaultUS).companyName— Business name, if the contractor operates as an entity.middleName— Contractor's middle name.phone(required) — Contractor's phone number.withholdPremium— Whether the platform withholds this contractor's premium from their wages (true) or the contractor pays it by card (false).
- Returns: The new contractor's
id,email, andname.
createLoginLink — Create a contractor login link (writes)
Create a one-time sign-in link to a contractor's own 1099Policy portal, for the user to send to that contractor. Returns the link and when it expires.
- Access: Write — requires a connection approved for Make changes; the assistant confirms before running it.
- Backed by:
POST /contractors/{id}/login_link - Inputs:
contractor(required) — Contractor public id (cn_…) to mint a login link for.redirectUrl— Optional URL to send the contractor to after they sign in.
- Returns: The one-time
urlfor that contractor and when it expires (expiresAt,expiresAtReadable). Nothing is sent to the contractor.
Jobs
listJobs — List or find jobs
List the account's jobs, or find one by id or name, with each job's category code, wage in dollars, wage type and work state. Returns the job ids the other job tools take.
- Access: Read
- Backed by:
GET /jobs - Inputs:
query— Optional. Match a single job by public id (jb_…) or name (case-insensitive substring).limit— Max job rows in the response (1-100). Counts cover every match. Default25.offset— Matching jobs to skip before the rows start; a previous result's nextOffset. Default0.
- Returns:
count(every match),nextOffsetwhen more remain, andjobs[](id, name, category code, wage in dollars, wage type, work state).
createJob — Create a job (writes)
Create a job with a work category, entity, wage and premium settings. Creates a real job record and returns its id.
- Access: Write — requires a connection approved for Make changes; the assistant confirms before running it.
- Backed by:
POST /jobs - Inputs:
name(required) — Job name / title.description(required) — Description of the work.entity(required) — Entity public id (en_…) the job runs under.categoryCode(required) — Work classification code (see listCategoryCodes).wage(required) — Wage in cents (150000 = $1,500.00), expressed per wageType; from 100 ($1) to 100000000 ($1,000,000).wageType(required) — How the wage is expressed: flatfee, hourly, unit or blended. One of:flatfee,hourly,unit,blended.yearsExperience— Contractor years of experience the job assumes.withholdPremium— Who pays the premium: the contractor, either way. True: they have allowed the platform to withhold the premium from their wages and pay it on their behalf. False: they pay it directly by card, and need a payment method on file before coverage can be placed on this job. The hiring company pays it in neither case. Defaults to false.
- Returns: The new job's
id,name,entity, andcategoryCode.
listCategoryCodes — List work category codes
Look up 1099Policy's approved work classification (category) codes when creating or matching a job. Optionally filter by code or name.
- Access: Read
- Backed by:
GET /category_codes - Inputs:
query— Optional. Filter by code or name (case-insensitive substring), e.g.photographyor a partial code.limit— Max category codes to return (1-100). Default50.
- Returns:
countandcategoryCodes[](code, name). Empty when the account has none configured yet — a job cannot be created until one is added in the dashboard.
Premium estimates
estimatePremium — Estimate a premium
Estimate the insurance premium for a contractor on a job, per coverage type, and check eligibility. Returns the estimated premium in dollars and the wage it is based on. The figure is a non-binding estimate, subject to eligibility and to 1099Policy's confirmation; it places no coverage and starts no billing. Saves the estimate so it can be listed later.
- Access: Read. Saves the estimate so it can be listed later; places no coverage and starts no billing.
- Backed by:
POST /quotes - Inputs:
job(required) — Job public id (jb_…) the work falls under.contractor(required) — Contractor public id (cn_…) to cover.coverageType(required) — One or more coverage types to price. Each one of:workers-comp,general,professional,media,cyber.effectiveDate— Coverage start as a Unix timestamp (seconds). Optional.endDate— Coverage end as a Unix timestamp (seconds). Optional.
- Returns:
quoteId,eligible,coverageTypes,premiumOwed(the estimated premium in dollars for the wage shown, taxes and fees included; for an hourly job that is one hour's pay with the fixed fees, not the cost of the whole job;nullwhen it cannot be worked out yet), thewageandwageTypeit is based on, and apremiumNote. Rates are not returned.
listPremiumEstimates — List premium estimates
List premium estimates made earlier, with each one's eligibility, coverage types and effective window.
- Access: Read
- Backed by:
GET /quotes - Inputs:
limit— Max quote rows in the response (1-100). Counts cover every quote. Default25.offset— Matching quotes to skip before the rows start; a previous result's nextOffset. Default0.
- Returns:
count(every estimate),nextOffsetwhen more remain, andquotes[]with eligibility, coverage types, and window.
Assignments
listAssignments — List assignments
List assignments — each ties a contractor to a job over a coverage window, optionally with a bound policy. Each row says whether it was cancelled and whether it is active today (not cancelled, today inside the window), with the job's work state. Optionally only active or only inactive ones.
- Access: Read
- Backed by:
GET /assignments - Inputs:
active— Optional. true: only assignments in force today (not cancelled, today inside the coverage window); false: only the rest.limit— Max assignment rows in the response (1-100). Counts cover every match. Default25.offset— Matching assignments to skip before the rows start; a previous result's nextOffset. Default0.
- Returns:
count(every match),nextOffsetwhen more remain, andassignments[]— contractor, job, the job's work state, coverage window, whether it was cancelled, whether it is active today, and the bound policy where there is one.
bindAssignment — Bind an assignment (writes coverage)
Place a contractor on a job under the coverage they already hold. This writes: with bind=true the assignment takes effect on a real policy and may issue COIs, and the premium for the job is invoiced through the account's existing billing exactly as it is from the dashboard. It is not a purchase: nothing is paid for here and no card or bank details are involved, and it cannot give coverage to someone who holds none — that person needs createInsuranceApplicationLink. estimatePremium previews the price without placing anyone.
- Access: Write — requires a connection approved for Make changes; the assistant confirms before running it.
- Not offered in ChatGPT.
- Backed by:
POST /assignments - Inputs:
contractor(required) — Contractor public id (cn_…) to place.job(required) — Job public id (jb_…) the contractor is placed on.coverageType— Coverage types to bind. Omit to use the job's configured coverage. Each one of:workers-comp,general,professional,media,cyber.effectiveDate(required) — Coverage start as a Unix timestamp (seconds). Required — the API rejects an assignment without an effective date.endDate(required) — Coverage end as a Unix timestamp (seconds).bind— When true (default), bind coverage now. Set false to create the assignment without binding a policy. Defaulttrue.
- Returns:
bound— true only when the API bound coverage — plus the assignment and policy ids and anote. Whenboundis false the note says why: the contractor is already covered, has no policy of ours to attach, or the placement did not fully process.
extendAssignment — Extend an assignment (writes coverage window)
Extend an active assignment's coverage end date. This writes: it moves a live coverage window forward and may adjust billing — no re-quote or new application.
- Access: Write — requires a connection approved for Make changes; the assistant confirms before running it.
- Not offered in ChatGPT.
- Backed by:
POST /assignments/extend - Inputs:
job(required) — Job public id (jb_…) whose assignment should be extended.endDate(required) — New coverage end date as a Unix timestamp (seconds).sendEmail— Whether to email the contractor about the extension.
- Returns:
extended, the assignment id, the newendDate, andstatus.
cancelAssignment — Cancel an assignment (writes, ends coverage)
Cancel a contractor's assignment on a job and end its insurance coverage. Ends real coverage; running it again does not restore it.
- Access: Write — requires a connection approved for Make changes; the assistant confirms before running it.
- Backed by:
POST /assignments/cancel - Inputs:
job(required) — Job public id (jb_…) whose assignment should be cancelled.reason— Optional human-readable reason for the cancellation.
- Returns:
cancelled— true only when the API reports it — withcancelledAt, or anotewhen coverage may still be active.
Insurance applications
getInsuranceApplication — Get an insurance application's status
Get where one contractor's insurance application stands: the step reached (such as sent, opened or completed) and whether it has expired.
- Access: Read
- Backed by:
GET /apply/sessions/{id} - Inputs:
session(required) — Application session public id (as_…) to inspect.
- Returns:
step,url,expired,enrolled, thequoteand (once issued) thepolicy, andcreated/createdReadable.
listInsuranceApplications — List insurance applications
List contractors' insurance applications with how far each has got: the step reached, whether it expired, whether a policy was issued, and how many days since it was sent. Filters to outstanding (the default), completed or expired applications. For questions about which contractors have not finished enrolling.
- Access: Read
- Backed by:
GET /apply/sessions - Inputs:
status— Which applications to return. 'outstanding' (default) is the chase list: sent, not expired, no policy issued yet. 'completed' has a policy. 'expired' ran out of time without one. One of:outstanding,completed,expired,all.contractor— Optional contractor public id (cn_…) to narrow to one person.limit— Max sessions to return (1-100). Default50.
- Returns:
statusfilter echoed back,count,complete, andsessions[]— contractor,step,daysSinceSent,expired,enrolled, and the policy once one exists. No application links;getInsuranceApplicationreturns the link for one application.
createInsuranceApplicationLink — Create an insurance application link (writes)
Start an application (opt-in) session and return the link a contractor uses to complete enrollment. This writes a session record and produces a link you send to a real contractor. Nothing is enrolled or paid for here: the contractor opens the link and completes the application on 1099Policy's own pages, where any payment happens between them and 1099Policy.
- Access: Write — requires a connection approved for Make changes; the assistant confirms before running it.
- Not offered in ChatGPT.
- Backed by:
POST /apply/sessions - Inputs:
quote(required) — Quote public id (qt_…) the application is based on.contractor— Optional contractor public id (cn_…) the session is for.successUrl— URL to redirect the contractor to after they complete.cancelUrl— URL to redirect the contractor to if they cancel.isGeneralOptIn— Whether this is a general opt-in (not tied to one job).generalOptInWorkState— Work state for a general opt-in, e.g.CA.
- Returns:
id, the applicationurlto send the contractor, the currentstep, andexpired.
Billing
listInvoices — List invoices
List premium invoices — each states what a contractor owes for a pay cycle, computed from their gross pay, with the pay-cycle window and purchase order number. Not the agency's or platform's own bill: what the account holder itself was invoiced is not in this list. Amounts are in dollars ("$1,250.00"); totals of gross pay and premium due cover every matching invoice. Optionally filtered by the date a pay cycle starts.
- Access: Read
- Backed by:
GET /invoices - Inputs:
paycycleStartFrom— Optional. Only invoices whose pay cycle starts on or after this date (YYYY-MM-DD, UTC).paycycleStartTo— Optional. Only invoices whose pay cycle starts on or before this date (YYYY-MM-DD, UTC).limit— Max invoice rows in the response (1-100). Totals and counts cover every match. Default25.offset— Matching invoices to skip before the rows start; a previous result's nextOffset. Default0.
- Returns:
countand totals of gross pay and premium due (every match),nextOffsetwhen more remain, andinvoices[]— premium due, gross pay, pay-cycle window, and purchase order number, per contractor, in dollars.
Organization and team
listEntities — List or find entities
List the business entities on the account (for organizations that run more than one), or find one by id or name. Jobs reference an entity id.
- Access: Read
- Backed by:
GET /entities - Inputs:
query— Optional. Match a single entity by public id or name (case-insensitive substring).limit— Max entity rows in the response (1-100). Counts cover every match. Default25.offset— Matching entities to skip before the rows start; a previous result's nextOffset. Default0.
- Returns:
count(every match),nextOffsetwhen more remain, andentities[]withrequiredCoverage,coverageLimit, andstate.
listTeamMembers — List team members
List the team members on the account — the dashboard users attached to the active organization, with their role, plus anyone invited who has not accepted yet. Covers the active organization; another organization's roster is read after switching to it with switchOrganization.
- Access: Read
- Backed by:
GET /team-members - Inputs:
query— Optional. Match a single member by email or name (case-insensitive substring).includeInvited— Include people invited but not yet accepted (statusinvited). Defaulttrue.limit— Max members to return (1-100). Default100.
- Returns:
count,active,invited, andteamMembers[](email, name, role, status).
inviteTeamMember — Invite a team member (writes)
Send an invitation to join the active organization as a member or owner. This emails a real person. They are not a member until they accept; listTeamMembers shows them as invited meanwhile. The API refuses an invitation that repeats one from the last seven days or names an existing member; listTeamMembers shows both. Each call covers the active organization only; another organization takes its own call after switchOrganization.
- Access: Write — requires a connection approved for Make changes; the assistant confirms before running it.
- Backed by:
POST /team-members - Inputs:
email(required) — The email address to invite.role— Role on the organization. One of:member,owner. Defaultmember.
- Returns:
invited,email,role,status, and anote: the invitation email is sent; they become a member when they accept.
removeTeamMember — Remove a team member (writes)
Remove a person from the active organization by email. Removes an active member, or cancels their outstanding invitation, whichever applies. Owners cannot be removed with an organization key. Each call covers the active organization only; another organization takes its own call after switchOrganization.
- Access: Write — requires a connection approved for Make changes; the assistant confirms before running it.
- Backed by:
DELETE /team-members - Inputs:
email(required) — The email address to remove.
- Returns:
removed,email, and anotesaying whether a member was removed or a pending invitation withdrawn.
getAuditTrail — Get account audit trail
List recent events on the account, newest first: policies bound or cancelled, assignments started or ended, applications, certificates reviewed, invoices charged. Each event gives its type, when it happened, and the ids of the records it touched. For questions about what changed recently or when something happened.
- Access: Read
- Backed by:
GET /events - Inputs:
type— Optional case-insensitive filter on the event type, e.g.policy,assignment,invoice.limit— Max events to return, newest first (1-100). Default25.
- Returns:
count,complete, andevents[]— type,created/createdReadable, and the ids of the records each event touched. The raw event payload is not returned. When atypefilter is applied to a partial page,filterNotesays so.
listOrganizations — List connected organizations
List the 1099Policy organizations this connection can act on, and which one is active. The other tools read and change the active organization only.
- Access: Read
- Backed by: none — reads the connection's own state.
- Inputs: none
- Returns:
count, theactiveorganization, andaccounts[](label, live or sandbox, active).
switchOrganization — Switch the active organization
Make another connected 1099Policy organization the active one, by its position in the organization list. Changes which organization the other tools act on; changes no records.
- Access: Read. Changes which organization the connection acts on; changes no records.
- Backed by: none — changes the connection's own state.
- Inputs:
account(required) — Which organization to switch to, as its position in listOrganizations (1 for the first); positions are only meaningful against that list.
- Returns:
switched, the now-activeorganization, and the list. The switch persists for the connection, including across token refreshes.
Classification
analyzeContract — Analyze a contract for misclassification risk
Judge whether a written work arrangement the user shared (a contract, statement of work, offer letter or email thread) holds up as independent-contractor work under a U.S. state's classification test. Takes the document's full text and the state whose law applies. Returns the overall risk, each factor of the test with a pass, fail or unclear verdict and the clause that drove it, and what to change. Writes nothing. The result is an automated heuristic, not legal advice.
- Access: Read
- Not offered in ChatGPT.
- Backed by:
POST /classification/analyses(stores nothing) - Inputs:
contractText(required) — The full text of the agreement from what the user shared (PDF, image or pasted text): every clause, in order, with its heading or number, as plain text rather than a summary.state— The U.S. state whose law applies, as a two-letter code (CA, NY, TX, MA) or FEDERAL for the U.S. Department of Labor test: the one the agreement's governing-law clause names, or where the work is performed. listClassificationStates shows what is available.contractor— Optional. The contractor (cn_…) the agreement is with, when they are on the account; their name is passed to the analysis.contractorName— Optional. The worker's or their business's name when there is no contractor record.
- Returns:
overallRisk(low, medium, high, critical),test,summary,factors[]withverdict(pass, fail, unclear), theevidencequoted from the text,explanationandrecommendation,recommendations[],disclaimer, and anextStep. A factor the text is silent on comes back as a question for the user.
listClassificationStates — List jurisdictions for contract analysis
List the U.S. states (two-letter codes) and FEDERAL whose worker-classification tests analyzeContract can apply, and which one is used when none is given.
- Access: Read
- Not offered in ChatGPT.
- Backed by:
GET /classification/states - Inputs: none.
- Returns:
statesand thedefaultapplied when none is given.
Talking to it
Ask in plain language. The assistant turns the request into a tool call and reports what the tool returned — never more than it returned.
Which organizations am I connected to?
Lists them and says which one is active.
Switch to Northwind, then show me who has no coverage.
Switches the active organization and answers there.
Does the videographer we booked in PA have active WC and GL for Saturday's shoot?
Finds the contractor, checks their active policies for workers' comp and general liability, and answers yes or no — with the policy and its dates.
Who on the account has no active coverage right now?
Sweeps every contractor, policy and quote — every page, not the first — and returns the ones with nothing active, with the count.
Show me our coverage as a chart.
Draws the share of contractors with an active policy in the conversation, with the count that have none and up to ten of their names.
Alvarez uploaded his own COI. Did it meet our GL requirements?
Returns the certificate's review: which requirements passed, which failed, and by how much. A contractor whose own certificate was approved is reported as insured, even though no 1099Policy policy is attached.
Here's the COI Alvarez just sent — does it cover us for the Northwind launch? (with the PDF or a photo of it attached)
Reads the certificate, checks it against your insurance requirement, and reports what passes and what falls short, with the amounts. What the certificate does not show — an expiration date, an unclear additional-insured box — comes back as a question to you, not as a guess.
Which freelancers still haven't finished their insurance application, and how long have they been sitting on it?
Lists the outstanding applications with the step each stopped at and the days since the link was sent.
What would it cost to cover Rivera, the freelance set designer, on the Denver install through end of quarter?
Estimates the premium and checks eligibility without placing any coverage, and reports the estimate in dollars with the wage it is based on. The figure is non-binding until 1099Policy confirms it.
Pull the certificate of insurance for Rivera's Denver install.
Returns the signed PDF download links for the COI issued when her coverage was bound.
What premium was invoiced for June?
Lists the invoices for pay cycles starting in June — what each contractor owed — with totals across all of them. These are the contractors' invoices, not the agency's own bill.
Here's the agreement we're about to send Rivera — will it hold up as a 1099 arrangement in California? (with the contract attached)
Transcribes the agreement, applies California's ABC test clause by clause, and reports the risk: which factors fail and the sentence that makes them fail, what to change, and what the agreement is silent on. It says plainly that this is an automated review, not legal advice. Not available in ChatGPT.
With a connection you approved for Make changes:
Rivera accepted. Bind her coverage for the Denver install, March 3 through 14.
Confirms the details with you, binds the assignment, and reports what came back — bound, or the reason it was not. Someone who has never enrolled has nothing to attach, so instead of attempting a bind that cannot succeed it offers to send them an application link.
The mural ran long. Extend Chen's coverage through the 15th.
Extends the assignment's coverage window.
The certificate looks right. File it.
Saves Alvarez's certificate to his record from the fields as read plus the answers you gave, runs the review, and reports whether it came back approved or flagged. No file is stored; the fields are, with who supplied each.
Put Alvarez's certificate PDF on his record.
Opens a drop zone in the conversation. The PDF dropped on it is stored on his record and reviewed like a dashboard upload, and the card shows the result: approved, or flagged with what is missing. Offered only on connections approved for Make changes.
Send Priya an application link for the copywriting engagement.
Creates an application link and returns it for you to send her.
Add dana@studio.example to the team as a member, on every organization I manage.
Invites her to each one, switching organizations as it goes.
Questions
Email integration@1099policy.com.
