bankAccounts_get
read
Get one bank account by id — name, currency, bank, and the format its statements are imported in.
id* string | integer
Model Context Protocol
Connect any MCP client to Flowtly and work with your data in plain language — read your finances and projects, and take a curated set of actions.
claude mcp add --transport http flowtly https://mcp.flowtly.eu/mcp
In Claude, ChatGPT, Gemini Enterprise or any other MCP client, add
https://mcp.flowtly.eu/mcp as a custom connector and sign in to Flowtly. There is nothing to
request and no key to obtain: the client registers itself, and the endpoint URL is the only
value most clients ask for.
If yours asks for more, it is a standard OAuth 2.1 public client —
registration https://mcp.flowtly.eu/oauth/register, authorization
https://mcp.flowtly.eu/oauth/authorize, token
https://mcp.flowtly.eu/oauth/token, PKCE S256 required, no client
secret. Paste any client_id whole; it is one long unbroken string.
OAuth scopes access to a single organization; every call forwards your own Flowtly token, so the backend enforces your permissions — the connector grants no extra rights.
Working across several organizations? Connect once per organization —
that is the supported way, and the connections coexist: each holds its own token, and adding
one never signs the others out. Each connection introduces itself as
flowtly-mcp (<organization>), so you can tell them apart in your client
before you call anything.
Invoices, transactions, contracts, suppliers and the ledger primitives.
bankAccounts_get
read
Get one bank account by id — name, currency, bank, and the format its statements are imported in.
id* string | integerbankAccounts_list
read
List the org's bank accounts. Filter by bank, or set hidden to include archived ones. Use it to resolve the bankAccount id that transactions_list filters on.
bank anyhidden booleancursor stringitemsPerPage integercontracts_get
read
Get one contract by id — parties, direction, value, cyclic terms and dates.
id* string | integercontracts_list
read
List contracts. Filter by direction — the stored values are "in" (REVENUE — we sell, the counterparty is our client; "Sprzedaż" in the UI) and "out" (COST — we buy, the counterparty is a supplier; "Zakup" in the UI), plus "unknown" — a real, filterable state rather than an error. A contract created by uploading a document starts as "unknown" and stays there until extraction or a person settles it, so omit the filter to get all three: "in" and "out" queried separately DO NOT add up to the whole set (flowtly-mcp#130). A lease where our organisation is the landlord (Wynajmujący) is "in"; construction, services and utilities we pay for are "out". NOT "outgoing"/"incoming": those match nothing and come back as an empty list rather than an error. Also filters on counterparty, project, cyclic, name or tags. Use it to resolve the contract id that contracts_paymentScheduleLines reads and that deals_win can link a won deal to.
direction anyproject anycounterparty anyname stringcyclic booleanexists.counterparty booleantags stringcursor stringitemsPerPage integercontracts_paymentScheduleLines
read
List a contract's payment schedule — the instalments it is expected to be invoiced or paid in. Pass contractId from contracts_list. This is the plan, not the actuals: compare it against transactions_list to see what has really been paid. Each line's amount is a WHOLE NUMBER OF 1/10000 UNITS (Price::MULTIPLIER) — not grosze: "53000000" is 5 300,00, so divide by 10000 (not 100) before reporting a figure to anyone.
contract anycontract.budgetContracts.budget anycontractId* string | integercursor stringitemsPerPage integercostGroups_list
read
List cost groups / cost centres — the buckets that costs, suppliers and incoming invoices are filed under. Use it to resolve the costGroup id that suppliers_create requires and that incoming-invoice suggestions propose.
order.name stringorder.description stringcursor stringitemsPerPage integercounterparties_get
read
Get one counterparty by id.
id* string | integercounterparties_list
read
List counterparties — every party the org transacts with. The supplier and client flags say which side(s) a counterparty plays, and one record can be both. This is the party on a bank transaction, so it is what incoming invoices and transactions are matched against. Filter by type, supplier, client, cyclic or budgetNeutral.
type anysupplier anyclient anycyclic booleanbudgetNeutral booleancursor stringitemsPerPage integerinvoices_get
read
Get one outgoing (sales) invoice by id — client, rows, totals, sale and issue dates, status.
id* string | integerinvoices_list
read
List outgoing (sales) invoices. Filter by client, tags, search, or a saleDate range. Note that saleDate — not issue date and not creation date — is the field invoices_export filters on, so use the same one here when reconciling an export.
client anyname stringid stringtags stringsaleDate.before stringsaleDate.strictly_before stringsaleDate.after stringsaleDate.strictly_after stringsearch stringproperties arraycursor stringitemsPerPage integersuppliers_list
read
List suppliers/contractors — served from /contractors, so "supplier" and "contractor" are the same record. Filter by cyclic for recurring suppliers. Use it to resolve the supplier that a cost, a contract or an incoming invoice is filed against.
cyclic booleanorder.name stringorder.description stringproperties arraycursor stringitemsPerPage integertaxGroups_list
read
List tax groups. Use it to resolve the taxGroup id that taxRules_list filters on and that invoice rows carry.
order.name stringcursor stringitemsPerPage integertransactions_list
read
List bank transactions — the bank feed that incoming invoices are matched against. Filter by bankAccount, counterpartyRole, cost, ignored, hasDetectedProblems, an orderDate/execDate range, or amount.between. Note orderDate and execDate are different: a payment can be ordered in one month and execute in the next.
cost anycounterparty anybankAccount anycounterpartyRole anyignored anyhasDetectedProblems booleanorderDate.before stringorderDate.strictly_before stringorderDate.after stringorderDate.strictly_after stringexecDate.before stringexecDate.strictly_before stringexecDate.after stringexecDate.strictly_after stringamount.between stringamount.gt stringamount.gte stringamount.lt stringamount.lte stringproperties arraysearch stringcursor stringitemsPerPage integertransactions_suggestions
read
Read Flowtly's proposals for one bank transaction — which counterparty, cost group or document it should be filed against. The mirror image of incomingInvoices_suggestions, from the money side. Read them before filing a line by hand, then accept one with transactions_applySuggestion.
cost anycounterparty anybankAccount anycounterpartyRole anyignored anyhasDetectedProblems booleanorderDate.before stringorderDate.strictly_before stringorderDate.after stringorderDate.strictly_after stringexecDate.before stringexecDate.strictly_before stringexecDate.after stringexecDate.strictly_after stringamount.between stringamount.gt stringamount.gte stringamount.lt stringamount.lte stringproperties arraysearch stringrefresh booleanid* string | integercursor stringitemsPerPage integerProjects, tasks, boards and comments.
projects_costAllocations
read
How costs were split ONTO this project — which transactions and invoice lines were attributed to it, and in what share. Use it to explain a profitability figure rather than just quote it: this is where an unexpected result is traced back to the document that caused it. Requires ROLE_TRANSACTIONS_MANAGER. Read-only.
includeSubProjects booleancostGroupId integertagIds arraydateFrom stringdateTo stringid* string | integerprojects_folderCounts
read
How many projects sit in each project FOLDER, as folderId + total + active. The folderId is a tagDefinition id — resolve names with tagDefinitions_list, and find which groups are folder groups with tagGroups_list (allowedRelations contains "project"). A null folderId is the uncategorized bucket. Counts root projects only, since folders group roots and phases follow their parent. Read-only.
status stringmember booleanemployee stringproperties arraydateFrom.before stringdateFrom.strictly_before stringdateFrom.after stringdateFrom.strictly_after stringdateTo.before stringdateTo.strictly_before stringdateTo.after stringdateTo.strictly_after stringname stringtype anyclient.name stringbudgetProjects.budget.name anysearch stringcursor stringitemsPerPage integerprojects_get
read
Get one project by id — name, type, client, dates, description and price.
id* string | integerprojects_list
read
List projects. Filter by type (fixed-price | time-and-material | non-billable | internal), client.name, employee, name, or dateFrom/dateTo ranges. Use it to resolve the project id that tasks, work-time logging, budgets and contracts all take.
status stringmember booleanemployee stringproperties arraydateFrom.before stringdateFrom.strictly_before stringdateFrom.after stringdateFrom.strictly_after stringdateTo.before stringdateTo.strictly_before stringdateTo.after stringdateTo.strictly_after stringname stringtype anyclient.name stringbudgetProjects.budget.name anysearch stringcursor stringitemsPerPage integerprojects_profitability
read
THE PER-PROJECT RESULT — what a project earned against what it cost. This is the number a services or development business is usually trying to see, and the one every other project tool feeds. Pass the project id from projects_list. Requires ROLE_ACCOUNT_MANAGER. Read-only.
type stringdateFrom stringdateTo stringid* string | integertaskComments_list
read
List comments on project tasks, oldest first. Filter by task to read one task's discussion.
task anyorder.createdAt stringcursor stringitemsPerPage integertaskLists_list
read
List task lists — the board columns/sections tasks are filed into. Filter by project. tasks_create takes a list id from here.
project anyname stringorder.position stringorder.name stringcursor stringitemsPerPage integertasks_get
read
Get one project task by id — title, project, status, list, assignees, dates and recurrence.
id* string | integertasks_list
read
List project tasks. Filter by project, list, status, assignees, isTemplate, or startAt/dueAt ranges. Recurring tasks expose recurrenceParent and recurrenceRule, so a generated occurrence can be traced back to the rule that produced it. To decide whether a task is DONE, compare its status against taskStatuses_list (isClosed) rather than matching on the status name. To find tasks by a custom-attribute value, pass attributeValue: an object mapping an attribute id (UUID or /attributes/<uuid> IRI) to the text to match. Matching is exact and ignores case; several entries AND together (all must match); at most 5 entries, each value 1-255 characters. Example (Arad, organisation 6n1p3fl8, attribute set "Events log" with the string attributes "Event: tenant" 2a664318-4117-45a0-bb20-857179cbbc04, "Event: unit" 8c29f0e7-3f2a-4f44-97ac-ac3c9bf2dc35 and "Event: responsible company" fd0c5ab7-0389-4dff-b704-338053bf6c65): unit 08 is attributeValue {"8c29f0e7-3f2a-4f44-97ac-ac3c9bf2dc35": "08"}.
project anylist anystatus anyassignees anysubscribers anyrecurrenceParent anyrecurrenceRule anyasset anyisTemplate booleanstartAt.before stringstartAt.strictly_before stringstartAt.after stringstartAt.strictly_after stringdueAt.before stringdueAt.strictly_before stringdueAt.after stringdueAt.strictly_after stringcompletedAt.before stringcompletedAt.strictly_before stringcompletedAt.after stringcompletedAt.strictly_after stringexists.dueAt booleanexists.assignees booleansearch stringopen booleanorder.position stringorder.dueAt stringorder.startAt stringorder.createdAt stringorder.title stringcursor stringitemsPerPage integerattributeValue objecttaskStatuses_list
read
List the project task statuses, in board order. isClosed marks the done states and isDefault the status a new task gets. Read this before interpreting a task's status — the names are org-configurable, so "Done" is not a reliable string to match on.
name stringisClosed booleanisStarted booleanisDefault booleanorder.position stringorder.name stringcursor stringitemsPerPage integerLog work time and read it back.
workTimes_get
read
Get a single work-time entry by id — date, minutes, project, notes and the employee it belongs to.
id* string | integerworkTimes_list
read
List work-time (logged hours) entries. Filter by date range (date.after / date.before, YYYY-MM-DD) and optionally by employee or project; page with cursor. Each row carries employeeId/employeeName and projectId/projectName, so this is how you export all logged hours for a period. IMPORTANT: org-wide results require ROLE_WORKING_HOURS_VIEWER. Without it the backend does NOT error — it silently returns only the connected user's own entries, so an "everyone's hours" export can come back containing one person and look perfectly fine. If every row belongs to one employee and you did not filter by employee, the response carries a scopeWarning saying so — surface it to the user rather than presenting the result as org-wide.
employee anyproject anydate.before stringdate.strictly_before stringdate.after stringdate.strictly_after stringprojectTree stringcursor stringitemsPerPage integeragreements_get
read
Get one employment agreement by id — type, variant, the dateFrom/dateTo window, hoursPerWeek, and the derived `calculable`, `active` and `status`. agreements_list supplies the id. Requires ROLE_AGREEMENTS_MANAGER or ROLE_MEETING_MANAGER. Read-only.
id* string | integeragreements_list
read
List employment agreements — filter by employee (IRI), isActive, type or variant. THE way to answer "why does people_list say this person is inactive": each row carries `calculable` and `active`, and a person is active exactly when they hold one that is both. Also the place to read the agreement `type` codes this org actually uses before calling agreements_create, since an org can add its own. Requires ROLE_AGREEMENTS_MANAGER or ROLE_MEETING_MANAGER. Read-only.
isActive booleantype anyemployee anyvariant anyorder.type stringorder.variant stringorder.dateFrom stringorder.dateTo stringcursor stringitemsPerPage integeragreementTypes_get
read
Get one contract type by id — its name or translationKey, `calculable`, `isActive`, `position` and `builtIn`. The id IS the code, so this reads back a type by the same string an agreement stores in `type`. Use it to confirm a type persisted after agreementTypes_create, and to check `calculable` before putting anyone on it. Requires ROLE_USER. Read-only.
id* string | integeragreementTypes_list
read
List the contract types THIS org can put on an agreement — the values behind `Ludzie > <person> > Umowy > Edytuj umowę`. Read it before agreements_create, because the list is per-tenant: five built-ins ship ("agreement", "annex", "termination", "list-of-intent", "work-experience") and an org can add its own, so a `type` that is valid in one org 422s in another. THE ID IS THE CODE — the `id` on each row is exactly the string `agreements_create` wants in `type`, not a numeric key to look up. `calculable` is the field that decides whether holding this type makes somebody ACTIVE and counts them into the resourcing bench, holiday accrual and the cost base; a non-calculable type leaves them inactive with no error anywhere, which is intended for a type like "list-of-intent" and a silent bug if you picked it by accident. `builtIn` rows carry a translationKey and a null name; custom rows carry a name rendered verbatim and a null translationKey. Requires ROLE_USER. Read-only.
order.position stringorder.name stringcursor stringitemsPerPage integerallocations_get
read
One allocation by id — a single person's booking on a project, with its dates and percentage. allocations_list finds the id; this reads the full record. An allocation with no employee is an OPEN role (unfilled demand), not a booking. Needs the resourcing module. Read-only.
id* string | integerallocations_list
read
List resourcing allocations — date-ranged assignments of a position on a project to an employee (or to nobody yet, an open role). No filters; page with cursor. Each item carries employeeId/employeeName and projectId/projectName already resolved (null employeeId means an open role); positionId is bare — resolve its name via positions_list. source distinguishes sheet-imported rows from ones created directly in Flowtly. Use this to reconcile a resourcing sheet import: read back what landed and compare against what was submitted.
cursor stringitemsPerPage integerassetBookings_get
read
Get one asset booking by id — the asset, its holder, the dates, and whether it has been cancelled. Read-only.
id* string | integerassetBookings_list
read
List asset bookings — who or what currently holds each asset, which is the assignment the Assets screen shows and the only place an asset-to-person link actually lives. Each row carries the asset, the holder (`relationName` employee | project plus `relationId`), start/end dates and, once released, `cancelReason` and `cancelledAt`. Filter by `property` to see one asset's history, or by `employee` to see everything one person holds — that second one is what to run before someone leaves. Note `employee` here is the NUMERIC id, not the /people IRI that assetBookings_create takes. Add `exists.cancelledAt: false` to see only what is still held; without it the list includes released bookings too. Read-only.
employee integerrelationName anyrelationId anyproperty anystartDate.before stringstartDate.strictly_before stringstartDate.after stringstartDate.strictly_after stringdateTo stringexists.cancelledAt booleancursor stringitemsPerPage integerassetCommercialRelations_get
read
Get one asset commercial relation by id -- asset (`property`), `project`, optional `propertyBooking`, `relationType` (infrastructure-access | parking-access | cost-allocation | service-access), amount, currency, dates, `invoiceable` and `note`. Read-only.
id* string | integerassetCommercialRelations_list
read
List asset commercial relations (Relacje handlowe) -- the non-lease claims a project holds on an asset: a telecom operator on a mast, a parking allowance, a cost allocation. Each row carries `property` (the ASSET, /assets/{id}), `project`, an optional `propertyBooking`, `relationType`, `amount` and `currency`, `dateFrom`/`dateTo`, `invoiceable` and `note`. `relationType` is one of infrastructure-access | parking-access | cost-allocation | service-access. Filters: `property`, `project`, `propertyBooking`, `relationType`, `currency`, `invoiceable`. Not paginated by the backend. Requires ROLE_PROJECTS_MANAGER or ROLE_ADMIN. Read-only.
property anyproject anypropertyBooking anyrelationType anycurrency anyinvoiceable booleancursor stringitemsPerPage integerassetMeterReadings_get
read
Get one meter reading by id — its meter, date and value. Read-only.
id* string | integerassetMeterReadings_list
read
List meter readings — the dated values recorded against an asset meter, the raw data the metered-billing split reads. Each row carries the meter, date and value. Use it to read a meter's history: a value that never moves across periods (a stuck or shared meter) bills zero, and a meter with no recent rows is one nobody is reading. Read-only.
meter anymeter.property anyreadingType anysource anyisEstimated booleanreadingAt.before stringreadingAt.strictly_before stringreadingAt.after stringreadingAt.strictly_after stringperiodFrom.before stringperiodFrom.strictly_before stringperiodFrom.after stringperiodFrom.strictly_after stringperiodTo.before stringperiodTo.strictly_before stringperiodTo.after stringperiodTo.strictly_after stringcursor stringitemsPerPage integerassetMeters_get
read
Get one asset meter by id — the asset it sits on, utility type, unit and external/QR identifier, with its readings. Read-only.
id* string | integerassetMeters_list
read
List the org's asset meters — the utility/media counters attached to assets (electricity, water, gas, heat). Each carries the asset it sits on, its utility type and unit, and its readings. Filter by `property` (the asset it belongs to) and `utilityType`. Use it to resolve the meter id that readings take, and to spot meters that read zero, are stuck on one value, or sit on a shared/collective meter. Read-only.
property anyutilityType anyreadingMode anyexternalId anyisActive booleancursor stringitemsPerPage integerassets_get
read
Get one asset by id — name, status, category (attributeSet), assetCode, serial number, purchase and warranty dates, location and booking settings. IT ALSO ANSWERS THE NESTING: `children` lists the IRIs of the assets nested under this one and is always present (`[]` when there are none), and `parent` is the IRI it is nested under, ABSENT rather than null on a top-level asset. Read `children` before assets_delete, which neither cascades nor refuses on them. Those IRIs read `/properties/42`, not `/assets/42` (these routes are an alias over the same resource); the number is the asset id this tool takes. Read-only.
id* string | integerassets_list
read
List the org's assets — the register of physical things it owns or sells, from laptops and desks to apartments, parking spaces and storage units. Filter by status (in-stock | damaged | sold), attributeSet (the category the Assets list groups by), bookingAllowed, or a partial name or serialNumber; order by name, status, serialNumber, boughtAt or warrantyTo. NOT PAGINATED — the whole set comes back in one response, so a large register is one big payload rather than a first page. THIS IS ALSO THE WHOLE NESTING TREE: every row carries `children` (the IRIs of the assets nested under it, `[]` when none) and `parent` (the IRI it is nested under, ABSENT on a top-level asset), so one call answers which units sit under which building without a filter — there is no `parent` filter, and none is needed. Those IRIs read `/properties/42`, not `/assets/42` (these routes are an alias over the same resource); the number is the asset id this tool's siblings take. Use it to resolve the asset id that asset bookings and asset documents take. Read-only.
status anybookingType anyattributeSet anyname stringserialNumber stringbookingAllowed booleanpark booleanorder.name stringorder.status stringorder.serialNumber stringorder.boughtAt stringorder.warrantyTo stringcursor stringitemsPerPage integerattributeEntityValues_list
read
List attribute VALUES — what a specific asset, project, budget or client actually holds for a bound attribute. Each row carries the attribute, the value, and `relationId` naming the entity it belongs to. Read-only.
cursor stringitemsPerPage integerattributePrices_get
read
Get one default rate by id — its rule, amount, currency and dateFrom. Requires ROLE_ATTRIBUTES_MANAGER. Read-only.
id* string | integerattributePrices_list
read
List the ORG-WIDE DEFAULT price for each rate category — what a category costs when no project says otherwise. This is the project-independent half of the model; projectPrices is the per-project half and overrides it. Paginated (page, itemsPerPage), ordered by amount or dateFrom. Requires ROLE_ATTRIBUTES_MANAGER. Read-only.
order.amount stringorder.dateFrom stringcursor stringitemsPerPage integerattributeRules_get
read
Get one rate category by id — its name, its attributeSet, and the attribute it is measured per (or none). Requires ROLE_ATTRIBUTES_MANAGER. Read-only.
id* string | integerattributeRules_list
read
List the RATE CATEGORIES an org bills under — "Base rent", "Service charge", "Operating costs". A rule is what a price hangs off: `attributeRule` is required and non-nullable on BOTH projectPrices and attributePrices, so resolve the rule first and everything else follows. Each row carries its attributeSet (the category family) and, optionally, the attribute the rate is measured PER. Requires ROLE_ATTRIBUTES_MANAGER, which unusually gates the read as well as the write. Read-only.
order.name stringcursor stringitemsPerPage integerattributes_get
read
Get one attribute definition by id — name, type, whether it is required or multiple, default value and format pattern. Read-only.
id* string | integerattributes_list
read
List attribute DEFINITIONS — the named fields (area, floor, price) that categories bind and assets carry values for. Each has a type: number | string | date | state | period. Read-only.
order.name stringorder.type stringcursor stringitemsPerPage integerattributeSetAttributes_list
read
List the bindings between categories and attribute definitions — which fields appear on which category. Read-only.
cursor stringitemsPerPage integerattributeSets_get
read
Get one attribute set by id — its name, relationName, icon, and the attributes bound to it. Read-only.
id* string | integerattributeSets_list
read
List the org's attribute sets — the CATEGORIES an asset, project, budget or client is filed under. Filter by relationName: "property" for asset categories (what the UI calls Typ zasobu and the Assets list groups by), plus "project", "budget" and "client". Reach for this before creating one: a category duplicated by spelling or casing silently splits the list it groups, and nothing in the UI explains why. Read-only.
relationName anyorder.name stringcursor stringitemsPerPage integerbanks_get
read
Get one bank by id — the institution, not an account held with it. Use bankAccounts_get for the account.
id* string | integerbanks_list
read
List the banks the org's accounts are held with. Hidden banks are INCLUDED by default — pass hidden=false for the pickers' view, or hidden=true to find the retired ones. Use it to resolve the bank id that bankAccounts_list filters on and that bankAccounts_create needs.
hidden booleancursor stringitemsPerPage integerbudgetAreaExclusions_list
read
List the units a budget leaves OUT of its cost-per-m2 area, one row per (budget, unit). Filter by `budget` (IRI "/budgets/<id>") to read one budget's list; an empty list means the budget uses the park's full area. Each row's own id is what budgetAreaExclusions_delete takes; the unit's id is a different thing. An exclusion applies to that one budget only. Requires ROLE_BUDGETS_VIEWER and the property-management module. Read-only.
budget anyproperty anyorder.id stringorder.createdAt stringorder.budget.id stringorder.budget.name stringorder.property.id stringorder.property.name stringcursor stringitemsPerPage integerbudgetContractors_list
read
List the budget-to-CONTRACTOR join rows — which suppliers each budget covers. Filter by budget. Each row's own id is what budgetContractors_delete takes.
budget anycontractor anyproperties arraycursor stringitemsPerPage integerbudgetContracts_list
read
List the budget-to-CONTRACT join rows — which contracts each budget covers. Filter by budget. Each row's own id is what budgetContracts_delete takes.
budget anycontract anycursor stringitemsPerPage integerbudgetGroups_list
read
List the org's budget groups — the roll-ups several budgets are totalled through, one per site, SPV or year. Use it to resolve the group IRI that budgets_update takes in `budgetGroup`, and to check whether the group you are about to create already exists: names are not unique. Needs ROLE_BUDGETS_VIEWER. Read-only.
cursor stringitemsPerPage integerbudgetPeriods_list
read
List the per-period plan rows of an operational budget — the monthly baseline and revenue figures, one row per `periodKey` (`YYYY-MM`). Filter by `budget` (the id) and optionally `periodKey`. This is how you read back what budgets_planUpsert wrote: AMOUNTS COME BACK AT 1/10000 OF THE CURRENCY, so 228000000 is 22 800,00 — the same scale planUpsert calls `1/10000`, not the `major` units you may have sent. Needs ROLE_BUDGETS_VIEWER. Read-only.
budget anyperiodKey anycursor stringitemsPerPage integerbudgetProjects_list
read
List the budget-to-PROJECT join rows — which projects each budget covers. Filter by budget to read one budget's scope. Each row's own id is what budgetProjects_delete takes; the project id is a different thing and deleting by it will not work. Note what this cannot express: scope is a SNAPSHOT of ids, with no "all projects" rule, so a project created tomorrow is not covered until somebody adds it (flowtly-app-backend#5498).
budget anyproject anyorder.id stringorder.createdAt stringorder.budget.id stringorder.budget.name stringorder.project.id stringorder.project.name stringcursor stringitemsPerPage integerbudgetRecoveryNettings_list
read
List the cost tags a budget NETS its tenant recoveries against, one row per (budget, tag). Filter by `budget` (IRI "/budgets/<id>") to read one budget's list; an empty list means the budget reports gross costs. Each row's own id is what budgetRecoveryNettings_delete takes; the tag definition's id is a different thing. Netting applies to that one budget only. Requires ROLE_BUDGETS_VIEWER and the property-management module. Read-only.
budget anytagDefinition anyorder.id stringorder.createdAt stringorder.budget.id stringorder.budget.name stringorder.tagDefinition.id stringorder.tagDefinition.name stringcursor stringitemsPerPage integerbudgets_employeePnl
read
P&L per employee for a budget — what each person's time earned against what they cost. Needs ROLE_BUDGETS_VIEWER. Read-only.
id* string | integerbudgets_get
read
Get one budget by id — its period, scope and settings, including `planSource` (`manual`, `contracts` or `initial_budget`) and, for `initial_budget`, `planInitialBudget`, the IRI of the initial budget the plan is read from (null otherwise). When the budget nets tenant recoveries against cost tags (budgetRecoveryNettings_create), the headline figures are NET: `currentPeriodRecovery` is the recovery taken out of the current period's expense AND income (so profit and loss is unchanged), and each `periodStats[]` entry carries `recovery` for its period. Both fields are ABSENT, not zero, when the budget has no netting. Needs ROLE_BUDGETS_VIEWER. Read-only.
id* string | integerbudgets_list
read
List the org's budgets — the periods against which income and cost are planned and compared. Use it to resolve the budget id that every pnl tool takes. Needs ROLE_BUDGETS_VIEWER. Read-only.
properties arrayname stringcursor stringitemsPerPage integerbudgets_pnlByTags
read
P&L for a budget, broken down BY TAG — income, costsByTag, costsByProject and netByTag over the budget's periods. The tag axis is what makes this readable for a business whose costs are not naturally per-project: tag the documents, and the split follows. THE PLAN SECTIONS FOLLOW THE BUDGET'S `planSource` (and say which one in `source`): `manual` gives one untagged plan row, `contracts` splits by the contracts' tags, and `initial_budget` gives one plan row per tag of the initial budget's lines, month by month — the only way to see a per-category plan. Read it before and after budgets_update changes the source, because the switch moves every planned figure. WHEN THE BUDGET NETS TENANT RECOVERIES (budgetRecoveryNettings_create) every figure here is NET: a netted tag's costsByTag row is reduced by the recoveries tagged with it, the income and netByTag sections and the totals by the same amount, so income minus expense never changes. The netted costsByTag rows then gain `netted: true`, `grossByPeriod` (the cost before netting), `recoveryByPeriod` (what was taken out), `ytdGross` and `ytdRecovery`, and a row can be NEGATIVE when recoveries exceed the cost. These fields are ABSENT, not zero, on rows that are not netted and on a budget with no netting at all. Carries displayPricePerSqm when the org has enabled price-per-sqm and named an area attribute, which is what turns this into a per-square-metre view for a property developer. THE FULL ANSWER IS LARGE — six sections, four of them repeated once per tag group, around 30 KB for seven categories over twelve months — so pass `sections` to name only the ones you need and keep the rest out of your context; `sections: []` returns the periods and the empty-section notices alone. The per-square-metre figures are the other half of the bulk: when displayPricePerSqm is on they sit beside every figure in every row, every total and every tag group, so pass `includePricePerSqm: false` to drop them unless you are reading the /m² view. Needs ROLE_BUDGETS_VIEWER. Read-only.
id* string | integersections arrayincludePricePerSqm booleanbudgets_pnlByTagsDrilldown
read
The documents behind one cell of budgets_pnlByTags. Reach for it when a tag total looks wrong — it names the transactions making up the number instead of leaving you to guess. Needs ROLE_BUDGETS_VIEWER. Read-only.
id* string | integersection stringtag stringperiod stringgranularity stringyear integer | stringproject string | integerbudgetTransactions_list
read
List the transactions that reach ONE budget. `budget` (id or IRI "/budgets/<id>") is effectively REQUIRED: without it the backend returns an empty list. Optional `year` filters by the transaction's related or order year. Rows include bookings that are NOT stored: a transaction that reaches the budget through a project, an attachment, a contractor or a tag is shown as a derived row whose id starts with `vpt-`, `vpta-` or `vtag-`, and which budgetTransactions_delete cannot remove. Only a row without such a prefix is a real manual booking, and a real booking takes priority over a derived row for the same transaction; read `attributionSources` to see how the budget is reached. To check whether a transaction is already booked to a budget, list that budget and look for the transaction there BEFORE budgetTransactions_create. Each real row's own id is what budgetTransactions_delete takes. Requires ROLE_BUDGETS_VIEWER.
budget stringyear integercursor stringitemsPerPage integerclients_get
read
Get one client by id — name, country, currency, tax id and status.
id* string | integerclients_list
read
List clients (the org's customers). Filter by status, or by externalPaymentCustomerId to find the client behind a payment-provider id. Use it to resolve the client id that invoices_list, deals_list, projects_list and contracts_list all filter on.
properties arrayexternalPaymentCustomerId anystatus anyorder.name stringorder.status stringorder.tin stringorder.tinCountry stringcursor stringitemsPerPage integerconfigKeys_catalog
read
List every organization config key the backend recognises, with its type and allowed values. This is the catalog of what is configurable — read it before configs_get or configs_update rather than guessing a key name. Permission is enforced per key by the backend, so a key appearing here does not guarantee the connected user may write it.
cursor stringitemsPerPage integerconfigs_get
read
Read one organization config value by id, where the id is a key from configKeys_catalog (e.g. organization-logo-url, organization-icon-url).
id* string | integercontractEvents_get
read
Get one contract event (lease milestone) by id: contract, label, description, occurredOn and kind (handover, rent_start, service_charge_start or null). Needs ROLE_CONTRACTS_VIEWER. Read-only.
id* string | integercontractEvents_list
read
List a lease's milestones (events its payments and rent hang off): handover of the premises, rent start, service-charge start, or any other the contract words (label). Filter by `contract` (IRI). Each row: id, contract, label, description, occurredOn (date, null while it has not happened) and `kind` (handover, rent_start, service_charge_start or null). The rent_start event is the one billing reads. Needs ROLE_CONTRACTS_VIEWER. Read-only.
contract anycursor stringitemsPerPage integercontractLeaseDetails_get
read
Get one lease-details row by id: contract, tradeName, contractNumber. Needs ROLE_CONTRACTS_VIEWER and the property-management module. Read-only.
id* string | integercontractLeaseDetails_list
read
List the lease details: the name a tenant trades under (`tradeName`) and the lease's own number (`contractNumber`), one row per lease. Filter by `contract` (IRI). Needs ROLE_CONTRACTS_VIEWER and the property-management module. Read-only.
contract anycursor stringitemsPerPage integercontractMoneyLines_get
read
Get one contract money line by id - a price the contract states (rent, service charge, fit-out), as it states it: kind, rateAmount, currency, unit, period, quantity, quantityFromContractArea, source and effectiveQuantityNow. Take the id from moneyLines[] on contracts_get. RATE SCALE: `rateAmount` is a whole number of 1/10000 units as a string, so 12.50 EUR per m2 per month is "125000" (NOT "12.50", not "1250"); `quantity` is the INVOICED AREA IN m2 as a decimal string with up to 4 decimals ("598.0000"), which is authoritative over the contract area for rent. Read-only. Needs ROLE_CONTRACTS_VIEWER.
id* string | integercrmNotes_get
read
Get one CRM note by id.
id* string | integercrmNotes_list
read
List notes written on leads and deals. Filter by lead or deal to read the running commentary on one record.
lead anydeal anycursor stringitemsPerPage integercurrencies_get
read
Get one currency by id — its code and symbol. Read-only.
id* string | integercurrencies_list
read
List the currencies the org can price in — and the ONLY way to resolve the `currency` IRI that projectPrices_create, attributePrices_create, clients_create and bankAccounts_create all require. Those fields take "/currencies/{id}", never a code like "EUR" or "RON", so this is the lookup that makes them usable. Read-only.
cursor stringitemsPerPage integerdealLostReasons_get
read
Get one deal lost-reason by id.
id* string | integerdealLostReasons_list
read
List the reasons a deal can be marked lost, in order. deals_lose requires a lostReasonId from here.
order.position stringcursor stringitemsPerPage integerdeals_get
read
Get one deal by id — title, client, stage, amount, owner, contact, expected and actual close dates.
id* string | integerdeals_list
read
List deals/opportunities — the sales pipeline. Filter by status (open / won / lost), stage, owner, client, lead, or by expectedCloseDate / closedAt ranges. Amounts are minor units with an explicit currency; do not assume the org's default.
status anystage anyowner anyclient anylead anytitle stringclosedAt.before stringclosedAt.strictly_before stringclosedAt.after stringclosedAt.strictly_after stringexpectedCloseDate.before stringexpectedCloseDate.strictly_before stringexpectedCloseDate.after stringexpectedCloseDate.strictly_after stringcreatedAt.before stringcreatedAt.strictly_before stringcreatedAt.after stringcreatedAt.strictly_after stringorder.createdAt stringorder.expectedCloseDate stringorder.amountMinor stringcursor stringitemsPerPage integerdealStageHistories_get
read
Get one deal stage-change record by id.
id* string | integerdealStageHistories_list
read
List a deal's stage transitions, newest first. Filter by deal. Every deals_update that moves the stage is logged here automatically, so this is how you reconstruct how long a deal sat in each stage — the deal itself only carries its current one.
deal anyorder.changedAt stringcursor stringitemsPerPage integerdepartments_list
read
The org's departments, with the numeric id each one is referenced by. READ THIS BEFORE people_create or people_update: both accept a `department` IRI and there is no other way to discover a valid one. The collection is unpaginated and ordered by name, so a single call returns every department the org has. Filter by `name` (partial match) or `code` (exact). Rows carry id, name and code; `manager` is a relation and is not included in list rows — read it with people_list from the other side if you need it. Requires ROLE_EMPLOYEES_VIEWER. Read-only.
order.name stringid anyname stringcode anycursor stringitemsPerPage integerdocuments_listForPerson
read
List one person's document records — exactly what People > Documents shows for them. Takes the person's id (from people_list / people_get). Each row carries the document id, its documentType, and the embedded storage row: id, relationName, relationId, size, mimeType, and originalFilename — the name the file carried when it was uploaded. The field is `originalFilename`, NOT `filename`: it is a display name, for showing the file and for naming a download, never a storage key and never a path. It is not an identity — two documents can carry the same name, and it is null on a row whose upload recorded none — so match a document by its id and type, never by name. Requires ROLE_DOCUMENTS_VIEWER, and the caller must also be able to read the person. Read-only.
id* string | integerdocumentTypes_list
read
List the org's document TYPES — the named requirements a person or other record can hold a file against (NDA, Stock Option Agreement, medical examination). Filter by relationName to get one relation's types: for employee documents that is the SINGULAR "employee" — "employees" is the storage namespace and matches nothing here. Each row carries id, name, relationName, required, expiring. REACH FOR THIS FIRST when filing a document: types are created by name and a second "NDA" is accepted, so listing before creating is what stops the list splitting in two. Requires ROLE_DOCUMENTS_VIEWER. Read-only.
order.name stringorder.description stringcursor stringitemsPerPage integeremployeeTransactionAttachments_list
read
List document-to-employee cost allocations — which incoming document (transactionAttachment) is allocated to which employee, for how much and as which cost component. Filter by employee or transactionAttachment. A document's employeeAllocations shows the same rows from the document side. Needs ROLE_TRANSACTIONS_MANAGER. Read-only.
transactionAttachment anyemployee anycursor stringitemsPerPage integeremployeeTransactions_list
read
List bank-line-to-employee cost allocations — which bank transaction is allocated to which employee, for how much and as which cost component. Filter by employee or transaction. A transaction's employeeTransactions shows the same rows from the bank side. Needs ROLE_TRANSACTIONS_MANAGER. Read-only.
transaction anyemployee anycursor stringitemsPerPage integerholidayCarryOvers_list
read
The STATED opening leave balance per person per year — what someone carried INTO a year, as asserted by the customer rather than derived from history. Filter by `employee` (IRI from people_list) and `year`. Reach for it to explain a balance that does not match an entitlement: where a row exists it OVERRIDES the derived carry-over for that year, so the derivation is not the answer. Amounts are in SECONDS and may be NEGATIVE — an 8h day is 28800, so 13 days reads 374400 and a 3-day deficit reads -86400. Not the same thing as holidayDaysLimits_list, which is the allowance that accrues. Requires ROLE_EMPLOYEES_MANAGER. Read-only.
employee anyyear anycursor stringitemsPerPage integerholidayDaysLimitDefaults_list
read
The ORG-WIDE default leave allowances — what someone is entitled to when nobody has given them a personal holidayDaysLimits row. Reach for it to explain a balance that nobody can find a per-person row for: the answer is usually a default on their contract variant. Rows are keyed by (holidayType, variant, dateFrom), so one type can differ per contract variant (uop, b2b, uz, uod) and change over time. Amounts are in SECONDS (#3763) — an 8h leave day is 28800, so 26 days is 748800 and 2 days is 57600. A default applies to everyone whose governing agreement has that `variant` and who has NO personal holidayDaysLimits row of the same type — a personal row always wins over it. So writing one moves the balance of every such employee at once, with no per-person step. Requires ROLE_HOLIDAYS_MANAGER. Read-only.
order.seconds stringorder.dateFrom stringorder.variant stringcursor stringitemsPerPage integerholidayDaysLimits_get
read
One entitlement row by id — the amount, the type, the contract variant and the date it takes effect. holidayDaysLimits_list finds the id. Amounts are in SECONDS (#3763). Read-only.
id* string | integerholidayDaysLimits_list
read
How much leave each person is ENTITLED to, per type — not how much they have taken, which is holidays_list. Filter by employee. A person can hold several rows for one type over time, because a balance gets topped up or corrected: the row IN FORCE is the one with the latest dateFrom that has already arrived, and rows dated ahead are deliberately ignored until then. Amounts are in SECONDS (#3763) — an 8h leave day is 28800. Requires ROLE_HOLIDAYS_MANAGER. Read-only.
employee anycursor stringitemsPerPage integerholidayRequests_list
read
Leave REQUESTS and where they stand — pending, approved, rejected. Distinct from holidays_list, which is booked leave: a request still awaiting a decision is not yet an absence, so plan against holidays_list and use this one to see what is waiting on someone. Supplies the holidayRequestId that holidays_approve and holidays_bulkApprove take. Read-only.
status anyemployee anytype anyorder.dateFrom stringorder.dateTo stringorder.type stringorder.status stringproject stringsearch stringcursor stringitemsPerPage integerholidays_active
read
Who is off RIGHT NOW — every currently-running leave, org-wide, for everyone. This is the tool for 'who is out today', and the one to cross-check before treating resourcingBench_get's freePercent as availability, because the bench does not subtract leave. Unlike holidays_list it applies no project scoping and needs no permission beyond being signed in, so its answer covers the whole organisation. Returns each absence with its type and dates. Read-only.
employee anytype anydateFrom.before stringdateFrom.strictly_before stringdateFrom.after stringdateFrom.strictly_after stringdateTo.before stringdateTo.strictly_before stringdateTo.after stringdateTo.strictly_after stringorder.dateFrom stringorder.dateTo stringorder.type stringproject stringcursor stringitemsPerPage integerholidays_get
read
One leave record by id, with its type, dates and duration. Get the id from holidays_list or holidays_active. Read-only.
id* string | integerholidays_list
read
Booked leave over a period — the planning view, where holidays_active answers only about today. Filter by employee, by date range, or by project. WHAT YOU SEE DEPENDS ON YOUR PERMISSIONS, and a short list is not proof nobody is off: a holidays manager or accountancy viewer gets the organisation, while a project lead or viewer MUST pass a project filter (or ask about themselves) and is refused outright without one — that refusal is a permission boundary, not an empty calendar. Read-only.
employee anytype anydateFrom.before stringdateFrom.strictly_before stringdateFrom.after stringdateFrom.strictly_after stringdateTo.before stringdateTo.strictly_before stringdateTo.after stringdateTo.strictly_after stringorder.dateFrom stringorder.dateTo stringorder.type stringproject stringcursor stringitemsPerPage integerholidayTypeReasons_list
read
The reason sub-pools defined on a leave type — Bespoke split `Okolicznościowa` into *inny*, *ślub*, *pogrzeb*, *narodziny* (flowtly-app-backend#5474). Read it to get the `reason` IRI that holidayDaysLimits_create and holidays_create accept; without one those fields cannot be filled. Filter by `holidayType` for one type's reasons, and by `isActive` — a retired reason stays listed so a grant made against it still resolves. Read-only.
holidayType anyisActive booleanorder.position stringorder.label stringcursor stringitemsPerPage integerholidayTypes_list
read
The leave types this org uses, with the id each one is referenced by. Read it before holidayDaysLimits_create/update, which need a holidayType IRI and will otherwise be guessed at. The one that is not a holiday in the ordinary sense is `pick-up-day` — time off owed for overtime already worked (Polish *odbior nadgodzin*), which is a GRANTED balance rather than an annual entitlement. Read-only.
order.name stringorder.status stringorder.descriptionRequired stringcursor stringitemsPerPage integerincomingInvoices_get
read
Get one incoming (supplier) invoice or supporting document by id, with its OCR'd fields and current match state.
id* string | integerincomingInvoices_list
read
List incoming (supplier) invoices and supporting documents — the accountancy inbox. An incoming invoice IS a document attached to a bank transaction, so exists.transaction=false is how you find documents that are not yet matched to a payment. Filter also by status, relatedMonth, counterparty, project, tags, name, invoiceNumber or hasDetectedProblems. TO DEDUPE BEFORE incomingInvoices_create, filter by counterparty (an exact filter) and compare the invoice number EXACTLY on the rows that come back: `invoiceNumber` and `name` are partial matches, so invoiceNumber=FV/1 also returns FV/10 and a non-empty result is not a hit. externalId IS NOT A FILTER ON THIS TOOL. Every document is fingerprinted as externalId 'upload_sha256:<sha256 of the bytes>' and that value is returned on every row, but passing externalId as a parameter is silently ignored and you get an UNFILTERED page back — which reads exactly like 'no duplicate found'. Compare the fingerprint on rows you have already fetched; never search for it. It only catches byte-identical files in any case: the same invoice re-rendered has a different hash, so also search name=<invoice number> when you know it (`name` is a partial match, so it finds both the OCR'd name and the original filename).
exists.transaction booleanhasDetectedProblems booleanproperties arraystatus stringrelatedMonth stringrelatedMonth.before stringrelatedMonth.strictly_before stringrelatedMonth.after stringrelatedMonth.strictly_after stringreceivedAt.before stringreceivedAt.strictly_before stringreceivedAt.after stringreceivedAt.strictly_after stringtags stringconnectedMonth stringorder.receivedAt stringorder.name stringorder.amount stringname stringinvoiceNumber stringcounterparty anyproject stringbudget stringcursor stringitemsPerPage integerincomingInvoices_matchCandidates
read
List the bank transactions that could be the payment for this incoming invoice, ranked by the backend's own matcher. Reach for it when a document has no transaction attached and you need to choose one; prefer these candidates over guessing from amounts yourself.
exists.transaction booleanhasDetectedProblems booleanproperties arraystatus stringrelatedMonth stringrelatedMonth.before stringrelatedMonth.strictly_before stringrelatedMonth.after stringrelatedMonth.strictly_after stringreceivedAt.before stringreceivedAt.strictly_before stringreceivedAt.after stringreceivedAt.strictly_after stringtags stringconnectedMonth stringorder.receivedAt stringorder.name stringorder.amount stringname stringinvoiceNumber stringcounterparty anyproject stringbudget stringid* string | integercursor stringitemsPerPage integerincomingInvoices_suggestions
read
Read Flowtly's own proposals for an incoming invoice — supplier match, cost group, matching bank transaction, duplicate warning. These are exactly the proposals a human sees in the app. Read them first, then apply one by id with incomingInvoices_applySuggestion, or take them all with acceptAllSuggestions. Pass refresh to recompute rather than serve the cached set.
exists.transaction booleanhasDetectedProblems booleanproperties arraystatus stringrelatedMonth stringrelatedMonth.before stringrelatedMonth.strictly_before stringrelatedMonth.after stringrelatedMonth.strictly_after stringreceivedAt.before stringreceivedAt.strictly_before stringreceivedAt.after stringreceivedAt.strictly_after stringtags stringconnectedMonth stringorder.receivedAt stringorder.name stringorder.amount stringname stringinvoiceNumber stringcounterparty anyproject stringbudget stringrefresh booleanid* string | integercursor stringitemsPerPage integerincomingInvoices_suggestionsDebug
read
Explain WHY an incoming invoice's suggestions came out as they did — the matcher's scoring, for diagnosing a missing or wrong suggestion. Diagnostic only; use incomingInvoices_suggestions for normal work.
id* string | integerinitialBudgetItems_list
read
List initial budget line items — the planned amounts, by tag, that contractComparison comes back against. Needs ROLE_BUDGETS_VIEWER. Read-only.
initialBudget anytagDefinition anycursor stringitemsPerPage integerinitialBudgets_contractComparison
read
PLANNED versus CONTRACTED, per tag — the initial budget's planned amounts against the sum of contract values actually signed for that project. This is the question 'have we committed more than we budgeted, and where', and it reads directly off the contracts already in the org, so importing contracts makes it answerable without any further work. Amounts are grosze; a mixed-currency project produces a notice rather than a silently wrong total. Needs ROLE_BUDGETS_VIEWER. Read-only.
tagDefinition arrayid* string | integerinitialBudgets_get
read
Get one initial budget by id, with its items. Needs ROLE_BUDGETS_VIEWER. Read-only.
id* string | integerinitialBudgets_list
read
List initial budgets — the ORIGINAL plan for a project or investment, as opposed to the live budget it is measured against. Needs ROLE_BUDGETS_VIEWER. Read-only.
project anycursor stringitemsPerPage integerinvoiceReminders_list
read
List the PAYMENT REMINDERS queue — what Finance > Invoices > Payment reminders shows. One row per reminder STAGED for an overdue unpaid invoice at one escalation `level`, carrying `status` (pending, sent, dismissed or failed), `dueAt` (when the stager proposed it), `invoiceId` and `invoiceName`, `clientName`, `amountDue` with `currencyCode`, `invoiceDueDate`, `daysOverdue`, `recipientEmail`, and afterwards `sentAt` with `sentBody`, or `failedAt` with `failureReason`. THE PENDING TAB IS `status: "pending"` AND THE HISTORY TAB IS `status: "sent,dismissed,failed"` — a CSV in one argument; an unfiltered call returns every state mixed together, soonest `dueAt` first. `search` matches the invoice number and the client name. `amountDue` IS NET OF CORRECTIONS, so it is what the client is told they owe rather than the invoice's own original total. THIS IS NOT invoices_list: a reminder exists only once the daily stager has picked the invoice up, so an invoice that is overdue with no row here has nothing queued to go out for it — and conversely a row here is a letter waiting on a human, not a letter sent. Requires ROLE_ADMIN, ROLE_INVOICES_MANAGER or ROLE_DEBT_COLLECTIONS_MANAGER. NOTE that ROLE_INVOICES_VIEWER, which is enough for invoices_list, does NOT read this queue. Read-only.
order.level stringorder.status stringorder.sentAt stringorder.dismissedAt stringorder.failedAt stringstatus stringsearch stringcursor stringitemsPerPage integerinvoiceReminders_preview
read
Read what approving reminder `id` WOULD ACTUALLY SEND, before anyone approves it: the resolved recipient, the CC list and the rendered default body. IT DOES NOT RETURN THE REMINDER, whatever the output schema says — the backend replaces the whole payload with exactly three keys, `address` ({email, name}, the client's first recorded contact), `ccs` (their remaining contacts, same shape) and `mailContent` (the default body, HTML). So `status`, `level` and `daysOverdue` come from invoiceReminders_list, never from here. It sends nothing and changes nothing: this is the compose screen's prefill, and the only honest way to answer "who is about to be emailed, and what will it say". Approving the letter is a separate call and is NOT served on every connection (#474): where it is, these three keys are what it takes, edited or unchanged — and where it is not, approving is done from Finance > Invoices > Payment reminders in the app. Either way nothing goes out because you read this. Requires ROLE_ADMIN, ROLE_INVOICES_MANAGER or ROLE_DEBT_COLLECTIONS_MANAGER. Read-only.
id* string | integerksef_outgoingImportSettings_get
read
Read whether this org automatically imports its OUTGOING (sales) invoices from KSeF, and the date it imports from. Returns { enabled, importFromDate }. Reach for this BEFORE the update tool: the update is a full replace, so you need the current value of the field you are not changing. Only meaningful for an org whose KSeF connection is already set up — connecting KSeF needs a per-org token the client supplies and is not on this surface. Requires ROLE_INVOICES_MANAGER. Read-only.
No parameters.
leadActivities_get
read
Get one lead activity (outreach touch) by id.
id* string | integerleadActivities_list
read
List a lead's outreach touches — its activity timeline (invite sent, replies, calls, follow-ups). Filter by lead to read one prospect's history. This is the structured counterpart to crmNotes_list: activities are the typed, dated touch-log; notes are freeform commentary.
lead anycontact anytype anychannel anyexternalId anythreadId anywave anylead.memberships.list anyoccurredAt.before stringoccurredAt.strictly_before stringoccurredAt.after stringoccurredAt.strictly_after stringorder.occurredAt stringorder.type stringcursor stringitemsPerPage integerleadContacts_get
read
Get one lead contact by id.
id* string | integerleadContacts_list
read
List the contact people attached to leads. Filter by lead to read one prospect's contacts, or by email to find which lead a message came from.
lead anyemail anylinkedinUrl anycursor stringitemsPerPage integerleadListMemberships_get
read
Get one lead-to-list membership by id. Its status and lastContactedAt are a caller-written snapshot, not live state — see leadListMemberships_list.
id* string | integerleadListMemberships_list
read
List which leads sit on which outbound prospecting lists. Filter by list, lead or status. CAUTION: status and lastContactedAt are a SNAPSHOT written by whoever last imported or updated the membership. They are not derived, and nothing advances them when an activity is recorded — logging a wave of 529 follow-ups moves neither field — so they can be arbitrarily far behind. To answer “when did we last touch this prospect”, read the activity log instead: leadActivities_list for one lead, leadActivities_byList for a whole campaign. leadListMemberships_syncFromActivities reports that gap and can close it, but IT IS NOT AVAILABLE ON THIS CONNECTION — it is served only to the internal scope, so ask your Flowtly operator to run it rather than looking for it here.
list anylead anystatus anycursor stringitemsPerPage integerleadLists_get
read
Get one outbound prospecting list by id.
id* string | integerleadLists_list
read
List outbound prospecting lists. Use it to resolve the list id that leadListMemberships_create takes.
status anychannel anycursor stringitemsPerPage integerleadLostReasons_get
read
Get one lead lost-reason by id.
id* string | integerleadLostReasons_list
read
List the reasons a lead can be marked lost, in order.
order.position stringcursor stringitemsPerPage integerleads_dedupeCheck
read
Check whether a prospect is already in the CRM, using the same filters as leads_list (companyName, source, owner, …). Call this BEFORE leads_create: a duplicate lead splits the outreach history across two records, and nothing downstream will merge them for you.
status anysource anyowner anyclient anycompanyName stringlinkedinUrl anydoNotContact booleancreatedAt.before stringcreatedAt.strictly_before stringcreatedAt.after stringcreatedAt.strictly_after stringclosedAt.before stringclosedAt.strictly_before stringclosedAt.after stringclosedAt.strictly_after stringorder.createdAt stringorder.companyName stringcursor stringitemsPerPage integerleads_get
read
Get one lead by id — company, website, source, status, owner and the client it converted to, if any.
id* string | integerleads_list
read
List leads — prospect targets, before qualification. Filter by status, source, owner, client, companyName, or createdAt/closedAt ranges. A qualified lead becomes a Client plus an open Deal via leads_convert; until then it lives only here, not in clients_list.
status anysource anyowner anyclient anycompanyName stringlinkedinUrl anydoNotContact booleancreatedAt.before stringcreatedAt.strictly_before stringcreatedAt.after stringcreatedAt.strictly_after stringclosedAt.before stringclosedAt.strictly_before stringclosedAt.after stringclosedAt.strictly_after stringorder.createdAt stringorder.companyName stringcursor stringitemsPerPage integerleadStages_get
read
Get one lead stage by id.
id* string | integerleadStages_list
read
List the stages a lead moves through, in order. Leads have their own stage set — deals use stages_list, which is a different thing.
order.position stringorder.label stringcursor stringitemsPerPage integerlocations_get
read
Get one location by id — its name and office hours. Read-only.
id* string | integerlocations_list
read
List the org's locations — the physical places assets sit, shown in the UI as Lokalizacja. Needs ROLE_LOCATIONS_MANAGER, which unusually gates the READ as well as the write. Read-only.
order.name stringcursor stringitemsPerPage integerorganizationAddresses_get
read
Get one subscription address record by id — name, street, city, postCode, country, and the tax fields. `street` carries the building number when it was entered by hand, and does not when it came from the NIP/GUS lookup. Read-only.
id* string | integerorganizationAddresses_list
read
List the organization's subscription address records — the address attached to the Flowtly subscription, and the source the mail-footer {{organizationAddress}} renders from. Normally exactly one row. This is NOT the invoice seller address, which lives in the organization-billing-* config keys (configs_get) and is what invoices and KSeF read; the two are maintained separately and routinely disagree. Read both before concluding which one a customer actually edited. Read-only.
organization anycursor stringitemsPerPage integerorganizationMailFooter_get
read
Read the organization's outgoing-mail footer text (the block appended to mail Flowtly sends on the org's behalf).
No parameters.
organizations_get
read
Get an organization by id — INCLUDING AN ORG THIS CONNECTION IS NOT BOUND TO. That is deliberate, not a leak: it is how a holding reads across its portfolio, so one connection can report on every company the authenticated user belongs to without a separate connection per company. The gate is membership — an org the user does not belong to is refused — and organizations_list is the roster of what that means for this identity. The response is the full record: config, bank accounts, positions, holiday requests and agreements. WHAT IT IS NOT is a statement about where you are working. A successful read here reads like confirmation you are in that org when you are not: writes still go to the connection's ACTIVE org, whatever id you just read — to write in this one, call organization.switch with its id first. So use organization_whoami to see where you are, confirm with tenant-scoped data (people_list, clients_list), and never start a bulk write on the strength of this call.
id* string | integerorganizations_list
read
List every organisation the AUTHENTICATED USER belongs to — the PORTFOLIO this identity can read, and exactly the set organization.switch can move this connection to. Listing does not move anything: the connection stays on its ACTIVE org (organization_whoami) until you switch. Two uses. First, the portfolio: each id here can be read in full with organizations_get, which is how a holding reports across its companies from one connection. Second, WHICH ORGS COULD THIS CONNECTION WORK IN AT ALL: if the org you want is absent, this identity has no membership in it — no switch and no amount of re-consenting will produce it. If it is present, organization.switch reaches it without reconnecting. To see where you actually are, use organization_whoami, and confirm with tenant-scoped data (people_list, clients_list); this list says nothing about that. Each row carries the org's id — the 8-character instance string a connection binds to — plus its name, slug, status, modules and features.
cursor stringitemsPerPage integerpeople_get
read
Get one person/employee record by id — names, emails, phone, manager, and whether they are active.
id* string | integerpeople_list
read
List people/employees. Filter by isActive, reportsTo (a manager's id), projectMembers.project, or search; page with cursor. People and employees share the same id, so this is how you resolve the employee id that work time, responsibilities, project membership and permission tools all expect.
activeForStaffing booleanisActive booleanid anyfirstname stringlastname stringreportsTo anyprojectMembers.project anyexists.userId booleanexists.reportsTo booleanexists.companyEmail booleanexcludedFromProjects booleanholidaySelfApproval booleansearch stringproperties arraycursor stringitemsPerPage integerpermissionGroups_get
read
Get one permission group by id, including the ROLE_* strings it grants.
id* string | integerpermissionGroups_list
read
List the org's permission groups and the roles each one grants — e.g. the "Business Owner" group grants ROLE_ADMIN. Read this before people_setPermissionGroups: the roles in the response are the authority on what a group actually permits, so you never have to guess from its name.
cursor stringitemsPerPage integerpipelines_get
read
Get one sales pipeline by id.
id* string | integerpipelines_list
read
List sales pipelines. A pipeline owns an ordered set of stages — read them with stages_list filtered by pipeline.
cursor stringitemsPerPage integerpositions_list
read
List positions — the named roles (e.g. "Backend Engineer") that a project allocation fills. No filters; Position has pagination disabled, so this always returns the org's full role catalog in one call. Each item is {id, name, roles}. Use it to resolve the position name behind an allocations_list row's positionId, and to find the position id a resourcing import must match against.
order.name stringcursor stringitemsPerPage integerprojectMembers_get
read
Get one project membership by id — its employee, project and position. Ids come from projectMembers_list or the projectMembers array on projects_get.
id* string | integerprojectMembers_list
read
List project memberships — WHO CAN SEE WHICH PROJECT. Filter by project (`/projects/{id}`) to read one project's roster, or by employee to read every project one person can reach; each row carries its own id, the employee, the project and the position (employee|tech-lead|account-manager|viewer). Reach for this first when someone reports a project missing from their Projects list or cannot log time against it: an empty roster, or a roster without them in it, IS the explanation — visibility is membership. It is also the id source for projectMembers_update and projectMembers_delete. Note the same person can appear several times on one project, once per position.
project anyemployee anycursor stringitemsPerPage integerprojectMeterPrices_list
read
List the client unit prices charged for metered utilities (used to price tenant utilities statements). Filters: `project` (IRI) and `utilityType` (electricity, water, gas, heat). A row WITH NO PROJECT is the organisation's DEFAULT tariff: it applies to every project that has no price row of its own. Requires ROLE_TRANSACTIONS_MANAGER. Read-only.
project anyutilityType anycursor stringitemsPerPage integerprojectPrices_get
read
Get one project rate by id — its project, property (null = inherited by the whole project), rule, amount, currency, dateFrom and note. Requires ROLE_PROJECTS_MANAGER. Read-only.
id* string | integerprojectPrices_list
read
List the rates in force ON A PROJECT — the stacked per-category amounts (base rent, service charge, operating costs) that make up what a tenant actually pays. Filter by `project` for everything on it, or by `property` for one asset's overrides. NOT PAGINATED — the whole set comes back in one response, unlike attributePrices. READ THE `property` FIELD ON EVERY ROW: null means the rate applies to every asset on the project by inheritance, and a value means it is an override for that one asset. A row with null property is not a row missing its asset. Requires ROLE_PROJECTS_MANAGER. Read-only.
project anyproperty anycursor stringitemsPerPage integerprojectTemplates_get
read
Get one project template by id, including its full structure document. projectTemplates_list finds the id. Read this before projectTemplates_update — the structure is written WHOLE, so an update must send the complete document, not a fragment. Read-only.
id* string | integerprojectTemplates_list
read
List the org's project templates — reusable blueprints of a project, its phases, its task lists and its tasks. Reach for this BEFORE projects_create when the same shape of project is set up repeatedly (an engagement type, an audit, an onboarding): instantiating a template builds the whole tree in one call, where projects_create makes an empty project you then have to fill by hand. The row flagged isDefault is the org's built-in template, applied to a project created with no template chosen. Read-only.
cursor stringitemsPerPage integerprojectTransactionAttachments_list
read
List cost-to-project allocations — which incoming invoice (transactionAttachment) is allocated to which project, and for how much. Filter by project or transactionAttachment. projects_costAllocations is the per-project summary of the same rows. Needs ROLE_TRANSACTIONS_MANAGER. Read-only.
transactionAttachment anyproject anycursor stringitemsPerPage integerprojectTransactions_list
read
List transaction-to-project links — which bank transaction (income or cost) is assigned to which project, and for how much. These are the rows a budget reads as source `transaction`/`pt` for its per-project inflows and outflows; document-level allocations of invoices are projectTransactionAttachments_list, not this. Filter by project (IRI /projects/{id}, or project[] for several) to audit what sits on a project; not paginated, so one call returns every link. There is no filter by transaction: transactions_list can return each transaction's projectTransactions (the ids of its links) when you name the field in its properties argument, since it is not in the default fields, but not their project or amount; to read those, filter this tool by the project the transaction is assigned to. Needs ROLE_TRANSACTIONS_MANAGER. Read-only.
project anycursor stringitemsPerPage integerresourceRequestCandidates_get
read
One recruitment candidate by id. The id comes from resourceRequestCandidates_list. Needs ROLE_HR_MANAGER. Read-only.
id* string | integerresourceRequestCandidates_list
read
The candidates put forward against hiring requests — people in a recruitment pipeline, not employees available for allocation. Filter by the request id from resourceRequests_list. Needs ROLE_HR_MANAGER. Read-only.
resourceRequest anycandidate anycursor stringitemsPerPage integerresourceRequests_get
read
One hiring request by id, with its position and status. Get the id from resourceRequests_list. HR/recruitment, not resourcing allocation. Needs ROLE_HR_MANAGER. Read-only.
id* string | integerresourceRequests_list
read
Open hiring requests — a request to recruit for a position, in the HR domain. Despite the name this is NOT resourcing allocation demand: it is recruitment. Returns the collection; resourceRequests_get reads one, and resourceRequestCandidates_list gives the people put forward for it. Needs ROLE_HR_MANAGER. Read-only.
status anycursor stringitemsPerPage integerresourcingRequests_list
read
Open resourcing requests — someone asking for a person to be allocated to a project, which is the demand side of resourcing. This is the flow the Resourcing UI's Requests view renders. Do NOT confuse it with resourceRequests_list: that one is HR RECRUITMENT (hiring for a position). Pair it with resourcingRequestsHistory_list for what has already been decided, and resourcingBench_get for who could satisfy a request. Needs the resourcing module and ROLE_RESOURCING_MANAGER. Read-only.
cursor stringitemsPerPage integerresourcingRequestsHistory_list
read
What has already happened to resourcing requests — the decision trail (confirmed, declined, changed) behind the open requests in resourcingRequests_list. Reach for it to answer 'was this already asked for and turned down?' before proposing the same allocation again. Needs the resourcing module and ROLE_RESOURCING_MANAGER. Read-only.
cursor stringitemsPerPage integerproject string | integerresponsibilities_get
read
Get one responsibility by id.
id* string | integerresponsibilities_list
read
List responsibilities inside a RACI group. Filter by responsibilityGroup. Responsibilities can nest via parent; people are assigned to them through responsibilityEmployees, not directly.
responsibilityGroup anycursor stringitemsPerPage integerresponsibilityEmployees_get
read
Get one responsibility assignment by id.
id* string | integerresponsibilityEmployees_list
read
List who is assigned to which responsibility, and at what percentage. Filter by employee to read one person's entire RACI load across every group.
employee anycursor stringitemsPerPage integerresponsibilityGroups_get
read
Get one responsibility group by id.
id* string | integerresponsibilityGroups_list
read
List responsibility groups / RACI areas — the top-level "Odpowiedzialności" items, each with an accountable person. Individual responsibilities hang underneath them.
cursor stringitemsPerPage integerscheduleEmployees_get
read
One schedule-to-employee assignment by id. The id comes from scheduleEmployees_list. Needs ROLE_SCHEDULES_MANAGER. Read-only.
id* string | integerscheduleEmployees_list
read
Which employees are assigned to which working-time schedules. Use it to go from a schedule (schedules_list) to its people, or to find the schedule a given employee follows. Needs ROLE_SCHEDULES_MANAGER. Read-only.
employee anydateFrom.before stringdateFrom.strictly_before stringdateFrom.after stringdateFrom.strictly_after stringdateTo.before stringdateTo.strictly_before stringdateTo.after stringdateTo.strictly_after stringcursor stringitemsPerPage integerschedulePlan_list
read
The schedules in force on ONE given date — pass the date in the path. Reach for it to answer 'who is working today / on this date' without reading every schedule and resolving its ranges yourself. Unlike the other schedule reads this only needs ROLE_USER, so it is the one available to an ordinary employee. Read-only.
current booleandate* string | integercursor stringitemsPerPage integerscheduleRanges_get
read
One schedule time range by id. The id comes from scheduleRanges_list. Needs ROLE_SCHEDULES_MANAGER. Read-only.
id* string | integerscheduleRanges_list
read
The time ranges that make up working-time schedules — the actual hours a schedule covers. Read the parent with schedules_get first; this expands its ranges. Needs ROLE_SCHEDULES_MANAGER. Read-only.
schedule anycursor stringitemsPerPage integerschedules_get
read
One working-time schedule by id, with its ranges and assigned employees. The id comes from schedules_list; scheduleRanges_list and scheduleEmployees_list read its parts. Needs ROLE_SCHEDULES_MANAGER. Read-only.
id* string | integerschedules_list
read
Working-time schedules — the shift/working patterns an org defines, NOT project allocation. Use resourcingSchedule_get for who is booked on what; use this for the working patterns themselves. schedules_get reads one by id. Needs ROLE_SCHEDULES_MANAGER. Read-only.
current booleancursor stringitemsPerPage integerstages_get
read
Get one deal stage by id.
id* string | integerstages_list
read
List deal stages, in order. Filter by pipeline. deals_create requires a stage id from here, and moving a deal between stages is what dealStageHistories records.
pipeline anyorder.position stringcursor stringitemsPerPage integertagCategories_get
read
Get one tagging category by id, with its name, required flag, position, multiple (cardinality lives on the category, because the category is the field) and allowedRelations. tagCategories_list supplies the id.
id* string | integertagCategories_list
read
List tagging CATEGORIES — the fields on the categorisation rail (#5186). A category is ONE field whose options are the union of several tag groups, not a section containing one dropdown per group. Its id is what tags_create passes as tagCategory to record which field an applied tag satisfies, which is the only way two categories drawing on the same groups stay distinguishable on read-back. Use tagCategoryGroups_list to see which groups feed each one.
cursor stringitemsPerPage integertagCategoryGroups_get
read
Get one category-to-group join by id, with its tagCategory, tagGroup and position. tagCategoryGroups_list supplies the id.
id* string | integertagCategoryGroups_list
read
List the ordered joins between tagging categories and tag groups — which groups feed which category, and in what order. Filter by tagCategory or tagGroup. This is the table to read before tagCategoryGroups_create, so a group is not attached to the same category twice.
tagCategory anytagGroup anycursor stringitemsPerPage integertagDefinitions_get
read
Get one tag definition by id — name, label, description, level and its tag group. tagDefinitions_list supplies the id.
id* string | integertagDefinitions_list
read
List tag definitions — the tags that can be attached to records, each inside a tag group. tags_create takes a tagDefinition id from here plus the record to attach it to.
cursor stringitemsPerPage integertagGroups_get
read
Get one tag group by id, with its name and allowedRelations. tagGroups_list supplies the id.
id* string | integertagGroups_list
read
List tag groups — the containers that organize tag definitions.
cursor stringitemsPerPage integertags_get
read
Get one applied tag by id — its tagDefinition, the record it is on (relationName + relationId), its tagCategory and weight. tags_list supplies the id.
id* string | integertags_list
read
List APPLIED tags — the actual links between a tag definition and a record, as opposed to tagDefinitions_list, which is the dictionary of what COULD be applied. Filter by relationName + relationId to read everything coded on one record, including each tag's tagCategory, which is what keeps two categories drawing on the same groups distinguishable on read-back (#5186). Each row's own id is what tags_delete takes. NOTE THE ONE QUESTION IT CANNOT ANSWER: there is no filter by tagDefinition, so "is anything anywhere coded with this definition?" cannot be asked directly — tagDefinitions_delete refusing is currently the reliable way to find out (flowtly-mcp#335).
relationName anyrelationId anytagDefinition anytagCategory anycursor stringitemsPerPage integertaxRules_list
read
List tax rules — the rates and the periods they apply to. Filter by taxGroup.
taxGroup anycursor stringitemsPerPage integertenantTurnovers_list
read
List tenant-reported monthly turnover: one row per tenant (counterparty) and calendar month, each with `period` (always the first of the month), `amount`, `currency` and `source`. Filters: `counterparty` (a counterparty id), `source`, and `period.after` / `period.before` (inclusive; `period.strictly_after` / `period.strictly_before` exclusive) as YYYY-MM-DD dates. AMOUNTS ARE COUNTS OF 1/10000 UNITS, as strings: "53000000" is 5300.00 in the row's own currency. A month with NO row means the tenant did not report it, which is not the same as a reported 0. Read-only. Nothing bills from these figures. Needs ROLE_CONTRACTS_VIEWER and the property-management module.
counterparty anysource anyperiod.before stringperiod.strictly_before stringperiod.after stringperiod.strictly_after stringcursor stringitemsPerPage integer