📄️ Get Agreement Cancellation Effective Date Types
Retrieves the list of effective-date types used to schedule agreement cancellations.
📄️ Get Agreement Cancellation Reasons
Retrieves the list of agreement cancellation reasons. The seeded list is a starter set; reasons are user-extensible.
📄️ Get Agreement Component Rule Types
Retrieves the list of agreement component rule types used to scope a component to a target.
📄️ Get Agreement Component Types
Retrieves the list of agreement component (billing model) types.
📄️ Create an agreement and its full hierarchy
Creates an agreement together with its components, rules, block hours (with overage rules), and time-and-materials rates.
📄️ List agreements
Returns a paged list of agreements with filtering by customer, status, name, agreement id, derived duration, derived term status, and start- / expiration-date ranges. Components and rules are not included; use GET /v1/agreements/{id} for the nested tree.
📄️ Create an Agreement from an Agreement Template
Copies an Agreement Template's full hierarchy into the customer tables. Stamps Source_Agreement_Template_ID + Version on the new agreement; per-BlockHour, stamps Source_Overage_Template_ID + Version when the template BlockHour referenced an Overage Template, otherwise copies the template's inline rules.
📄️ Get an agreement by id with its full hierarchy
Returns an agreement with its components, rules, block hours (with overage rules), and time-and-materials rates nested.
📄️ Update an agreement and its full hierarchy
Updates an agreement together with its components, rules, block hours (with overage rules), and time-and-materials rates. Children with an Id are updated, those without an Id are inserted, and existing rows missing from the payload are deleted. Returns the post-write hierarchy.
📄️ List active agreements in an expiration time window
Returns notification candidates between inclusive UTC timestamps, ordered by agreement ID. ExpirationFrom and ExpirationTo must include a UTC offset. AgreementExpiration is the UTC expiration instant; consumers apply reminder offsets. Continue with nextAfterAgreementId and the same window.
📄️ Get profitability KPIs for an agreement
Returns profitability KPIs (monthly recurring revenue, component count, current- and last-period margin, and utilization) for an agreement, rolled up and broken out per component.
📄️ Get ticket activity recorded against an agreement
Returns ticket IDs and agreement-only billing totals, split into billed and unbilled entries, plus time-log IDs needed to resolve historical ledger rows.
📄️ Activate an agreement
Transitions a PENDING agreement to ACTIVE and bills its unbilled one-time items: ledger destination posts to the customer ledger; ticket destination requires TicketId in the body (caller pre-creates the ticket).
📄️ Renew an expiring agreement
Rolls the agreement into its next term, refreshes block-hour included units, and reposts previously billed one-time items flagged Bill on Renewal as fresh billed items: ledger destination posts to the customer ledger; ticket destination requires TicketId in the body (caller pre-creates the ticket).
📄️ Lock an agreement from template propagation
Sets Is_Locked = true on the agreement. Subsequent Agreement Template / Overage Template propagate apply calls will skip this agreement.
📄️ Unlock an agreement so template propagation will affect it again
Sets Is_Locked = false on the agreement.
📄️ Cancel an agreement
Cancels an agreement. Persists a tblAgreementCancellationRequest row, disconnects all services + customer-products scoped by the agreement's component rules, runs Customer.SyncStatus per affected service-customer, and flips the agreement to CANCELLED. Future-dated effective dates are honored on the Line/CustomerProduct disconnect dates; the agreement itself flips immediately (eventing-driven deferred flip is a follow-up).
📄️ List assets associated with an agreement
List assets associated with an agreement
📄️ Associate assets with an agreement
Associate assets with an agreement
📄️ Remove an asset association from an agreement
Remove an asset association from an agreement
📄️ List Ticket Types that narrow agreement activity matching
List Ticket Types that narrow agreement activity matching
📄️ Add Ticket Type matching rules to an agreement
Add Ticket Type matching rules to an agreement
📄️ Remove a Ticket Type matching rule from an agreement
Remove a Ticket Type matching rule from an agreement
📄️ Add a component to an agreement
Adds a single component with an optional list of rules. The component and its rules commit atomically.
📄️ Get an agreement component
Retrieves a single component with its rules nested.
📄️ Update an agreement component
Updates the component's fields and reconciles its rule list. Existing rule ids are preserved when the rule's (rule type, customer, service) key is unchanged; removed keys are deleted and new keys are inserted.
📄️ Delete an agreement component
Deletes the component hierarchy. Rejects billed one-time items and rate-bearing components on agreements that are no longer pending.
📄️ Create a Block Hour
Creates a Block Hour rate arrangement under a Block Hours-typed component. Only allowed while the parent agreement is in PENDING status; otherwise returns 400. Returns the new block-hour id.
📄️ List Block Hours
Returns a paged list of Block Hours under the specified component. Sortable on every Response field; searchable per field with Contains for strings, Equals for IDs/booleans, range for numerics and dates.
📄️ Get a Block Hour by id
Retrieves a single Block Hour rate arrangement under the specified agreement component.
📄️ Update a Block Hour
Updates a Block Hour. Only allowed while the parent agreement is in PENDING status; otherwise returns 400. Rate / cost / effective-date changes are auto-snapshotted into Block Hour History.
📄️ Delete a Block Hour
Deletes a Block Hour and any child overage rules / history snapshots. Only allowed while the parent agreement is in PENDING status; otherwise returns 400.
📄️ Create a Block Hour Overage Rule
Creates an overage tier under a Block Hour. Only allowed while the parent agreement is in PENDING status; otherwise returns 400. Returns the new rule id.
📄️ List Block Hour Overage Rules
Returns a paged list of Overage Rules under the specified Block Hour. Sortable on every Response field; searchable per field with range for numerics.
📄️ Get a Block Hour Overage Rule by id
Retrieves a single Block Hour Overage Rule under the specified Block Hour.
📄️ Update a Block Hour Overage Rule
Updates an overage tier under a Block Hour. Only allowed while the parent agreement is in PENDING status; otherwise returns 400.
📄️ Delete a Block Hour Overage Rule
Deletes an overage tier under a Block Hour. Only allowed while the parent agreement is in PENDING status.
📄️ List Block Hour History
Returns a paged list of historical rate snapshots for a Block Hour. Sortable on every Response field; searchable per field with range for numerics and dates.
📄️ Create a Time And Material rate
Creates a Time and Materials rate arrangement under a Time-and-Materials-typed component. Only allowed while the parent agreement is in PENDING status; otherwise returns 400. Returns the new rate id.
📄️ List Time And Materials rates
Returns a paged list of Time and Materials rates under the specified component. Sortable on every Response field; searchable per field with Contains for strings, Equals for IDs/booleans, range for numerics and dates.
📄️ Get a Time And Material rate by id
Retrieves a single Time and Materials rate arrangement under the specified agreement component.
📄️ Update a Time And Material rate
Updates a Time and Materials rate. Only allowed while the parent agreement is in PENDING status; otherwise returns 400. Rate / cost / effective-date changes are auto-snapshotted into Time And Material History.
📄️ Delete a Time And Material rate
Deletes a Time and Materials rate and any child history snapshots. Only allowed while the parent agreement is in PENDING status; otherwise returns 400.
📄️ List Time And Material History
Returns a paged list of historical rate snapshots for a Time and Materials rate. Sortable on every Response field; searchable per field with range for numerics and dates.
📄️ Bill selected one-time items on demand
Bills selected unbilled one-time items of an agreement.
📄️ Create a materials-ledger entry
Records a material consumed on a Time-and-Materials-typed component. The API resolves the covering agreement component from exact ServiceId and CustomerId rules; when multiple components match, the lowest AgreementComponentId is selected. ServiceId and CustomerId must belong together when both are supplied. It computes Amount from Quantity and UnitRate and Cost from Quantity and UnitCost, then returns the ledger entry, agreement, and component ids.
📄️ Get a materials-ledger entry by id
Retrieves a single materials-ledger entry under the specified agreement component.
📄️ Update a materials-ledger entry
Updates a materials-ledger entry. Returns 409 if the row has already been billed. Recomputes Amount and Cost from the new Quantity / Unit_Rate / Unit_Cost.
📄️ Delete a materials-ledger entry
Deletes a materials-ledger entry. Returns 409 if the row has already been billed.
📄️ List materials-ledger entries
Returns a paged list of materials-ledger entries under the specified component. Sortable on every Response field; filterable by Product_ID, Service_ID, Time_Log_ID, billing transaction, billed flag, and Usage_Date / Amount ranges.
📄️ List products-ledger entries
Returns a paged list of products-ledger entries under the specified component
📄️ List agreement links for a PSA ticket's items
Returns which of the ticket's items are covered by an agreement, identified by TimeLogId or TicketPartsLaborId.
📄️ List usage-ledger entries
Returns a paged list of usage-ledger entries under the specified component. Sortable on every Response field; searchable per field with Equals for IDs and the billed flag, range for Usage_Date and Amount.
📄️ Get the usage balance for a (time-log-reason, period) bucket
Returns the balance row for the calendar month containing the supplied usageDate, scoped to the given timeLogReasonId. Returns 404 when no balance exists yet for that bucket (no usage has been accrued).
📄️ Grant another included-unit allotment for the current period
Grant another included-unit allotment for the current period
📄️ Accrue a Time Log into the usage ledger
Records a PSA time log against agreement components selected by exact ServiceId and CustomerId rules. Every exact match is evaluated, and the API does not infer either scope from the other. It filters matches by TimeLogReasonId and UsageDate, segments hours across included and overage tiers, snapshots rates, writes ACCRUAL rows, and updates period balances. Idempotent on Time_Log_ID — retrying with the same Time_Log_ID returns the existing ledger row ids.
📄️ Apply an edited PSA Time Log to the usage ledger
Apply an edited PSA Time Log to the usage ledger
📄️ Get Agreement Statuses
Retrieves the list of agreement statuses.