REST endpoints for memberships in ServFlo: 16 operations with parameters, request and response fields, permissions and curl examples.
Base URL: https://app.servflo.ai/api. Every call needs Authorization: Bearer sfk_… (Authentication); {organizationId} ($ORGANIZATION_ID in the examples) is your business's id.
GET /organizations/{organizationId}/membership-plans
The organization's membership plans (price, frequency, term, included visits, discounts, priority) with memberCount (active and paused members). Retired plans only with includeInactive. Read-only.
How often the plan bills: WEEKLY (every 7 days), BIWEEKLY (every 2 weeks), EVERY_4_WEEKS (every 28 days), MONTHLY, QUARTERLY, SEMI_ANNUAL, ANNUAL, or ONE_TIME (once per term, at signup or renewal). Week-based periods run in days from the term's first day; the last one is clipped to the term and prorated by days. One of WEEKLY, BIWEEKLY, EVERY_4_WEEKS, MONTHLY, QUARTERLY, SEMI_ANNUAL, ANNUAL, ONE_TIME.
POST /organizations/{organizationId}/membership-plans
Creates a plan customers can sign up to. Included visits name service types from GET /service-types (400 for another organization's). The term must be a whole number of billing periods. Nothing is billed until a customer signs up.
Permission
memberships.plans.manage (Owner, Admin)
Risk
write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.
How often the plan bills: WEEKLY (every 7 days), BIWEEKLY (every 2 weeks), EVERY_4_WEEKS (every 28 days), MONTHLY, QUARTERLY, SEMI_ANNUAL, ANNUAL, or ONE_TIME (once per term, at signup or renewal). Week-based periods run in days from the term's first day; the last one is clipped to the term and prorated by days. One of WEEKLY, BIWEEKLY, EVERY_4_WEEKS, MONTHLY, QUARTERLY, SEMI_ANNUAL, ANNUAL, ONE_TIME.
termMonths
integer
Yes
Term length in months; a whole number of billing periods for MONTHLY to ANNUAL (week-based frequencies clip the last period). 1–60.
autoRenewDefault
boolean
No
New members renew automatically by default.
includedVisits
array of object
No
Up to 20 items.
includedVisits[].serviceTypeId
string
Yes
From GET /service-types.
includedVisits[].count
integer
No
Visits of this service per term. Required unless everyWeeks is set (then it is derived from the cadence and the term). 1–52.
includedVisits[].months
array of integer or null
No
Preferred calendar months, 1–12 (e.g. [4, 10] for spring and fall tune-ups). Up to 12 items.
includedVisits[].spacingMonths
integer or null
No
Months between visits when no months are given; default spreads them evenly. 1–60.
includedVisits[].everyWeeks
integer or null
No
A week cadence: one visit every N weeks through the term (e.g. 2 = a wash every other week), from the term's first day or the first weekday on or after it. Overrides count, months and spacingMonths. 1–52.
includedVisits[].weekday
integer or null
No
Preferred day of the week for an everyWeeks cadence: 0 = Sunday … 6 = Saturday. 0–6.
serviceDiscountPercent
number
No
Member discount on service / labour lines of quotes and invoices, percent. 0–100.
materialDiscountPercent
number
No
Member discount on material lines, percent. 0–100.
priority
boolean
No
Members' work is flagged Priority on the dispatch board.
taxable
boolean
No
Membership invoices are taxed at the property's rate (never for tax-exempt customers), as other invoices.
How often the plan bills: WEEKLY (every 7 days), BIWEEKLY (every 2 weeks), EVERY_4_WEEKS (every 28 days), MONTHLY, QUARTERLY, SEMI_ANNUAL, ANNUAL, or ONE_TIME (once per term, at signup or renewal). Week-based periods run in days from the term's first day; the last one is clipped to the term and prorated by days. One of WEEKLY, BIWEEKLY, EVERY_4_WEEKS, MONTHLY, QUARTERLY, SEMI_ANNUAL, ANNUAL, ONE_TIME.
How often the plan bills: WEEKLY (every 7 days), BIWEEKLY (every 2 weeks), EVERY_4_WEEKS (every 28 days), MONTHLY, QUARTERLY, SEMI_ANNUAL, ANNUAL, or ONE_TIME (once per term, at signup or renewal). Week-based periods run in days from the term's first day; the last one is clipped to the term and prorated by days. One of WEEKLY, BIWEEKLY, EVERY_4_WEEKS, MONTHLY, QUARTERLY, SEMI_ANNUAL, ANNUAL, ONE_TIME.
Changes a plan for NEW signups only: existing members keep the price, frequency, discounts and included visits frozen at their signup. active: false retires the plan.
Permission
memberships.plans.manage (Owner, Admin)
Risk
write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.
How often the plan bills: WEEKLY (every 7 days), BIWEEKLY (every 2 weeks), EVERY_4_WEEKS (every 28 days), MONTHLY, QUARTERLY, SEMI_ANNUAL, ANNUAL, or ONE_TIME (once per term, at signup or renewal). Week-based periods run in days from the term's first day; the last one is clipped to the term and prorated by days. One of WEEKLY, BIWEEKLY, EVERY_4_WEEKS, MONTHLY, QUARTERLY, SEMI_ANNUAL, ANNUAL, ONE_TIME.
termMonths
integer
No
Term length in months; a whole number of billing periods for MONTHLY to ANNUAL (week-based frequencies clip the last period). 1–60.
autoRenewDefault
boolean
No
New members renew automatically by default.
includedVisits
array of object
No
Up to 20 items.
includedVisits[].serviceTypeId
string
Yes
From GET /service-types.
includedVisits[].count
integer
No
Visits of this service per term. Required unless everyWeeks is set (then it is derived from the cadence and the term). 1–52.
includedVisits[].months
array of integer or null
No
Preferred calendar months, 1–12 (e.g. [4, 10] for spring and fall tune-ups). Up to 12 items.
includedVisits[].spacingMonths
integer or null
No
Months between visits when no months are given; default spreads them evenly. 1–60.
includedVisits[].everyWeeks
integer or null
No
A week cadence: one visit every N weeks through the term (e.g. 2 = a wash every other week), from the term's first day or the first weekday on or after it. Overrides count, months and spacingMonths. 1–52.
includedVisits[].weekday
integer or null
No
Preferred day of the week for an everyWeeks cadence: 0 = Sunday … 6 = Saturday. 0–6.
serviceDiscountPercent
number
No
Member discount on service / labour lines of quotes and invoices, percent. 0–100.
materialDiscountPercent
number
No
Member discount on material lines, percent. 0–100.
priority
boolean
No
Members' work is flagged Priority on the dispatch board.
taxable
boolean
No
Membership invoices are taxed at the property's rate (never for tax-exempt customers), as other invoices.
How often the plan bills: WEEKLY (every 7 days), BIWEEKLY (every 2 weeks), EVERY_4_WEEKS (every 28 days), MONTHLY, QUARTERLY, SEMI_ANNUAL, ANNUAL, or ONE_TIME (once per term, at signup or renewal). Week-based periods run in days from the term's first day; the last one is clipped to the term and prorated by days. One of WEEKLY, BIWEEKLY, EVERY_4_WEEKS, MONTHLY, QUARTERLY, SEMI_ANNUAL, ANNUAL, ONE_TIME.
GET /organizations/{organizationId}/membership-settings
The status the scheduler gives membership invoices (DRAFT or SENT) and the lead time, in days, before a member visit's due month that its job is created. Read-only.
Sets the status of future membership invoices (invoiceStatus: DRAFT to review first, SENT to issue them directly; nothing is emailed either way) and the visit lead time (visitLeadDays, 0–180). Applies from the next scheduler run.
Permission
memberships.plans.manage (Owner, Admin)
Risk
write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.
Memberships newest first (by end date for a renewal window), filtered by status, plan, customer, property or renewalWithinDays (ACTIVE ones whose term ends within that many days: the Renewals view), with total and a summary strip: active members, MRR (normalised to a month), renewals due in 30 days, member visits waiting for a date. Read-only.
Permission
memberships.read (Owner, Admin, Dispatcher)
Risk
read, OAuth scope servflo.read. Read: reads only.
MCP tool
memberships_list (toolset sales, in the default set)
Free-text search over the list's names, numbers and contact details. Up to 200 characters.
status
query
enum
No
ACTIVE (billing and visits run), PENDING (not started), PAUSED (nothing runs until pausedUntil or reinstated), CANCELLED, EXPIRED (term ended without renewal). One of ACTIVE, PENDING, PAUSED, CANCELLED, EXPIRED.
planId
query
string
No
customerId
query
string
No
propertyId
query
string
No
businessUnitId
query
string
No
Only this business unit (GET /business-units), or "none" for records without one. Up to 100 characters.
renewalWithinDays
query
integer
No
Only ACTIVE memberships ending within this many days (30, 60, 90). 1–366.
today
query
string
No
The business's today (YYYY-MM-DD) for date checks; used only within a day of the organization's own date (its timezone). Default: that date.
limit
query
integer
No
Page size, 1–200. Default 50.
offset
query
integer
No
Rows to skip; the answer's total counts every match. Default 0.
How often the plan bills: WEEKLY (every 7 days), BIWEEKLY (every 2 weeks), EVERY_4_WEEKS (every 28 days), MONTHLY, QUARTERLY, SEMI_ANNUAL, ANNUAL, or ONE_TIME (once per term, at signup or renewal). Week-based periods run in days from the term's first day; the last one is clipped to the term and prorated by days. One of WEEKLY, BIWEEKLY, EVERY_4_WEEKS, MONTHLY, QUARTERLY, SEMI_ANNUAL, ANNUAL, ONE_TIME.
items[].termMonths
integer
items[].serviceDiscountPercent
number
items[].materialDiscountPercent
number
items[].priority
boolean
items[].taxable
boolean
items[].status
enum
ACTIVE (billing and visits run), PENDING (not started), PAUSED (nothing runs until pausedUntil or reinstated), CANCELLED, EXPIRED (term ended without renewal). One of ACTIVE, PENDING, PAUSED, CANCELLED, EXPIRED.
items[].startDate
string
Signup date, YYYY-MM-DD.
items[].termNumber
integer
Current term, 1 = the first.
items[].termStartDate
string
items[].endDate
string
Last day of the current term.
items[].autoRenew
boolean
items[].nextBillingDate
string or null
Start of the next period to bill; null when nothing more is due in the committed terms.
items[].cancelledAt
string (date-time) or null
items[].cancelReason
string or null
items[].pausedUntil
string or null
items[].pausedAt
string (date-time) or null
items[].sourceQuoteId
string or null
items[].businessUnitId
string or null
Business unit; null = none.
items[].notes
string or null
items[].createdAt
string (date-time)
items[].updatedAt
string (date-time)
items[].monthlyRecurringCents
integer
The price normalised to a month (MRR contribution).
items[].visitUsage
object
Included visits of the current term.
items[].visitUsage.included
integer
items[].visitUsage.used
integer
Completed this term.
items[].visitUsage.remaining
integer
Due or scheduled this term.
items[].customer
object
items[].customer.id
string
items[].customer.name
string
items[].property
object or null
items[].property.id
string
items[].property.name
string or null
items[].property.address
string or null
items[].property.city
string or null
items[].plan
object
items[].plan.id
string
items[].plan.name
string
items[].plan.active
boolean
total
integer
summary
object
summary.activeMembers
integer
summary.mrrCents
integer
Monthly recurring revenue of ACTIVE memberships.
summary.renewalsDue30
integer
ACTIVE memberships whose term ends within 30 days.
summary.memberVisitsDue
integer
Generated member visits still waiting for a date (Dispatch Needs scheduling).
Creates an ACTIVE membership (MEM-n) on an active plan, freezing the plan's price, frequency, discounts and included visits, and lays out the first term's visits. A membership starting today is processed at once: its first billing period is invoiced (status per GET /membership-settings; nothing is charged or emailed) and visits whose window is open become unscheduled jobs. Customer from GET /customers, property (optional; one of the customer's) from GET /customers/{customerId}, plan from GET /membership-plans.
Optional; without one, member pricing covers all the customer's properties.
startDate
string
No
Defaults to today.
autoRenew
boolean
No
Defaults to the plan's setting.
sourceQuoteId
string or null
No
The customer's quote that sold the membership, kept as a link.
soldByTechnicianId
string or null
No
The technician who sold it, for membership-sale commissions (else the source quote's seller).
businessUnitId
string or null
No
Business unit (GET /business-units). Omitted: the selling technician's home unit; null = none. Its billing invoices and member visits follow it. Up to 100 characters.
notes
string or null
No
agreement
object or null
No
The customer's signed agreement, when they signed up on a technician's phone.
agreement.terms
string
Yes
The agreement shown (GET /signing-terms resolved.membershipTerms). Up to 5000 characters.
agreement.signedBy
string
Yes
Up to 200 characters.
agreement.signatureDataUrl
string or null
No
A data:image/png;base64 URL.
today
string
No
The business's today (YYYY-MM-DD) for date checks; used only within a day of the organization's own date (its timezone). Default: that date.
How often the plan bills: WEEKLY (every 7 days), BIWEEKLY (every 2 weeks), EVERY_4_WEEKS (every 28 days), MONTHLY, QUARTERLY, SEMI_ANNUAL, ANNUAL, or ONE_TIME (once per term, at signup or renewal). Week-based periods run in days from the term's first day; the last one is clipped to the term and prorated by days. One of WEEKLY, BIWEEKLY, EVERY_4_WEEKS, MONTHLY, QUARTERLY, SEMI_ANNUAL, ANNUAL, ONE_TIME.
termMonths
integer
serviceDiscountPercent
number
materialDiscountPercent
number
priority
boolean
taxable
boolean
status
enum
ACTIVE (billing and visits run), PENDING (not started), PAUSED (nothing runs until pausedUntil or reinstated), CANCELLED, EXPIRED (term ended without renewal). One of ACTIVE, PENDING, PAUSED, CANCELLED, EXPIRED.
startDate
string
Signup date, YYYY-MM-DD.
termNumber
integer
Current term, 1 = the first.
termStartDate
string
endDate
string
Last day of the current term.
autoRenew
boolean
nextBillingDate
string or null
Start of the next period to bill; null when nothing more is due in the committed terms.
cancelledAt
string (date-time) or null
cancelReason
string or null
pausedUntil
string or null
pausedAt
string (date-time) or null
sourceQuoteId
string or null
businessUnitId
string or null
Business unit; null = none.
notes
string or null
createdAt
string (date-time)
updatedAt
string (date-time)
monthlyRecurringCents
integer
The price normalised to a month (MRR contribution).
visitUsage
object
Included visits of the current term.
visitUsage.included
integer
visitUsage.used
integer
Completed this term.
visitUsage.remaining
integer
Due or scheduled this term.
includedVisits
array of object
includedVisits[].serviceTypeId
string
includedVisits[].count
integer
includedVisits[].months
array of integer or null
includedVisits[].spacingMonths
integer or null
includedVisits[].everyWeeks
integer or null
includedVisits[].weekday
integer or null
soldByTechnicianId
string or null
The technician credited with the sale.
agreementTerms
string or null
The agreement the customer signed on a technician's phone.
agreementSignedBy
string or null
agreementSignedAt
string (date-time) or null
agreementSignature
string or null
Their drawn signature (PNG data URL).
customer
object
customer.id
string
customer.name
string
customer.email
string or null
customer.phone
string or null
property
object or null
property.id
string
property.name
string or null
property.address
string or null
property.city
string or null
plan
object
plan.id
string
plan.name
string
plan.active
boolean
sourceQuote
object or null
sourceQuote.id
string
sourceQuote.identifier
string
sourceQuote.status
string
visits
array of object
visits[].id
string
visits[].termNumber
integer
visits[].sequence
integer
visits[].serviceTypeId
string or null
visits[].serviceName
string
visits[].serviceType
object or null
visits[].serviceType.id
string
visits[].serviceType.name
string
visits[].serviceType.color
string
visits[].dueMonth
string
YYYY-MM
visits[].dueDate
string or null
YYYY-MM-DD for a visit on a week cadence; null for month-based visits.
visits[].status
enum
DUE (not booked yet; its job may already wait in Dispatch Needs scheduling), SCHEDULED (the job has a date), COMPLETED, SKIPPED (cancelled or expired). One of DUE, SCHEDULED, COMPLETED, SKIPPED.
GET /organizations/{organizationId}/memberships/{membershipId}
One membership: the plan snapshot, every included visit by term (due month, status, the job it became), billing history with invoices, and status. Read-only. Ids come from GET /memberships.
How often the plan bills: WEEKLY (every 7 days), BIWEEKLY (every 2 weeks), EVERY_4_WEEKS (every 28 days), MONTHLY, QUARTERLY, SEMI_ANNUAL, ANNUAL, or ONE_TIME (once per term, at signup or renewal). Week-based periods run in days from the term's first day; the last one is clipped to the term and prorated by days. One of WEEKLY, BIWEEKLY, EVERY_4_WEEKS, MONTHLY, QUARTERLY, SEMI_ANNUAL, ANNUAL, ONE_TIME.
termMonths
integer
serviceDiscountPercent
number
materialDiscountPercent
number
priority
boolean
taxable
boolean
status
enum
ACTIVE (billing and visits run), PENDING (not started), PAUSED (nothing runs until pausedUntil or reinstated), CANCELLED, EXPIRED (term ended without renewal). One of ACTIVE, PENDING, PAUSED, CANCELLED, EXPIRED.
startDate
string
Signup date, YYYY-MM-DD.
termNumber
integer
Current term, 1 = the first.
termStartDate
string
endDate
string
Last day of the current term.
autoRenew
boolean
nextBillingDate
string or null
Start of the next period to bill; null when nothing more is due in the committed terms.
cancelledAt
string (date-time) or null
cancelReason
string or null
pausedUntil
string or null
pausedAt
string (date-time) or null
sourceQuoteId
string or null
businessUnitId
string or null
Business unit; null = none.
notes
string or null
createdAt
string (date-time)
updatedAt
string (date-time)
monthlyRecurringCents
integer
The price normalised to a month (MRR contribution).
visitUsage
object
Included visits of the current term.
visitUsage.included
integer
visitUsage.used
integer
Completed this term.
visitUsage.remaining
integer
Due or scheduled this term.
includedVisits
array of object
includedVisits[].serviceTypeId
string
includedVisits[].count
integer
includedVisits[].months
array of integer or null
includedVisits[].spacingMonths
integer or null
includedVisits[].everyWeeks
integer or null
includedVisits[].weekday
integer or null
soldByTechnicianId
string or null
The technician credited with the sale.
agreementTerms
string or null
The agreement the customer signed on a technician's phone.
agreementSignedBy
string or null
agreementSignedAt
string (date-time) or null
agreementSignature
string or null
Their drawn signature (PNG data URL).
customer
object
customer.id
string
customer.name
string
customer.email
string or null
customer.phone
string or null
property
object or null
property.id
string
property.name
string or null
property.address
string or null
property.city
string or null
plan
object
plan.id
string
plan.name
string
plan.active
boolean
sourceQuote
object or null
sourceQuote.id
string
sourceQuote.identifier
string
sourceQuote.status
string
visits
array of object
visits[].id
string
visits[].termNumber
integer
visits[].sequence
integer
visits[].serviceTypeId
string or null
visits[].serviceName
string
visits[].serviceType
object or null
visits[].serviceType.id
string
visits[].serviceType.name
string
visits[].serviceType.color
string
visits[].dueMonth
string
YYYY-MM
visits[].dueDate
string or null
YYYY-MM-DD for a visit on a week cadence; null for month-based visits.
visits[].status
enum
DUE (not booked yet; its job may already wait in Dispatch Needs scheduling), SCHEDULED (the job has a date), COMPLETED, SKIPPED (cancelled or expired). One of DUE, SCHEDULED, COMPLETED, SKIPPED.
Turns auto-renew on or off, moves the membership to another of the customer's properties (or none) and edits its notes. The plan snapshot cannot change.
How often the plan bills: WEEKLY (every 7 days), BIWEEKLY (every 2 weeks), EVERY_4_WEEKS (every 28 days), MONTHLY, QUARTERLY, SEMI_ANNUAL, ANNUAL, or ONE_TIME (once per term, at signup or renewal). Week-based periods run in days from the term's first day; the last one is clipped to the term and prorated by days. One of WEEKLY, BIWEEKLY, EVERY_4_WEEKS, MONTHLY, QUARTERLY, SEMI_ANNUAL, ANNUAL, ONE_TIME.
termMonths
integer
serviceDiscountPercent
number
materialDiscountPercent
number
priority
boolean
taxable
boolean
status
enum
ACTIVE (billing and visits run), PENDING (not started), PAUSED (nothing runs until pausedUntil or reinstated), CANCELLED, EXPIRED (term ended without renewal). One of ACTIVE, PENDING, PAUSED, CANCELLED, EXPIRED.
startDate
string
Signup date, YYYY-MM-DD.
termNumber
integer
Current term, 1 = the first.
termStartDate
string
endDate
string
Last day of the current term.
autoRenew
boolean
nextBillingDate
string or null
Start of the next period to bill; null when nothing more is due in the committed terms.
cancelledAt
string (date-time) or null
cancelReason
string or null
pausedUntil
string or null
pausedAt
string (date-time) or null
sourceQuoteId
string or null
businessUnitId
string or null
Business unit; null = none.
notes
string or null
createdAt
string (date-time)
updatedAt
string (date-time)
monthlyRecurringCents
integer
The price normalised to a month (MRR contribution).
visitUsage
object
Included visits of the current term.
visitUsage.included
integer
visitUsage.used
integer
Completed this term.
visitUsage.remaining
integer
Due or scheduled this term.
includedVisits
array of object
includedVisits[].serviceTypeId
string
includedVisits[].count
integer
includedVisits[].months
array of integer or null
includedVisits[].spacingMonths
integer or null
includedVisits[].everyWeeks
integer or null
includedVisits[].weekday
integer or null
soldByTechnicianId
string or null
The technician credited with the sale.
agreementTerms
string or null
The agreement the customer signed on a technician's phone.
agreementSignedBy
string or null
agreementSignedAt
string (date-time) or null
agreementSignature
string or null
Their drawn signature (PNG data URL).
customer
object
customer.id
string
customer.name
string
customer.email
string or null
customer.phone
string or null
property
object or null
property.id
string
property.name
string or null
property.address
string or null
property.city
string or null
plan
object
plan.id
string
plan.name
string
plan.active
boolean
sourceQuote
object or null
sourceQuote.id
string
sourceQuote.identifier
string
sourceQuote.status
string
visits
array of object
visits[].id
string
visits[].termNumber
integer
visits[].sequence
integer
visits[].serviceTypeId
string or null
visits[].serviceName
string
visits[].serviceType
object or null
visits[].serviceType.id
string
visits[].serviceType.name
string
visits[].serviceType.color
string
visits[].dueMonth
string
YYYY-MM
visits[].dueDate
string or null
YYYY-MM-DD for a visit on a week cadence; null for month-based visits.
visits[].status
enum
DUE (not booked yet; its job may already wait in Dispatch Needs scheduling), SCHEDULED (the job has a date), COMPLETED, SKIPPED (cancelled or expired). One of DUE, SCHEDULED, COMPLETED, SKIPPED.
POST /organizations/{organizationId}/memberships/{membershipId}/pause
Stops billing and visit generation until pausedUntil (it resumes on that day; periods that fell due while paused are not billed) or until reinstated. The term end does not move. Only ACTIVE memberships (409).
How often the plan bills: WEEKLY (every 7 days), BIWEEKLY (every 2 weeks), EVERY_4_WEEKS (every 28 days), MONTHLY, QUARTERLY, SEMI_ANNUAL, ANNUAL, or ONE_TIME (once per term, at signup or renewal). Week-based periods run in days from the term's first day; the last one is clipped to the term and prorated by days. One of WEEKLY, BIWEEKLY, EVERY_4_WEEKS, MONTHLY, QUARTERLY, SEMI_ANNUAL, ANNUAL, ONE_TIME.
termMonths
integer
serviceDiscountPercent
number
materialDiscountPercent
number
priority
boolean
taxable
boolean
status
enum
ACTIVE (billing and visits run), PENDING (not started), PAUSED (nothing runs until pausedUntil or reinstated), CANCELLED, EXPIRED (term ended without renewal). One of ACTIVE, PENDING, PAUSED, CANCELLED, EXPIRED.
startDate
string
Signup date, YYYY-MM-DD.
termNumber
integer
Current term, 1 = the first.
termStartDate
string
endDate
string
Last day of the current term.
autoRenew
boolean
nextBillingDate
string or null
Start of the next period to bill; null when nothing more is due in the committed terms.
cancelledAt
string (date-time) or null
cancelReason
string or null
pausedUntil
string or null
pausedAt
string (date-time) or null
sourceQuoteId
string or null
businessUnitId
string or null
Business unit; null = none.
notes
string or null
createdAt
string (date-time)
updatedAt
string (date-time)
monthlyRecurringCents
integer
The price normalised to a month (MRR contribution).
visitUsage
object
Included visits of the current term.
visitUsage.included
integer
visitUsage.used
integer
Completed this term.
visitUsage.remaining
integer
Due or scheduled this term.
includedVisits
array of object
includedVisits[].serviceTypeId
string
includedVisits[].count
integer
includedVisits[].months
array of integer or null
includedVisits[].spacingMonths
integer or null
includedVisits[].everyWeeks
integer or null
includedVisits[].weekday
integer or null
soldByTechnicianId
string or null
The technician credited with the sale.
agreementTerms
string or null
The agreement the customer signed on a technician's phone.
agreementSignedBy
string or null
agreementSignedAt
string (date-time) or null
agreementSignature
string or null
Their drawn signature (PNG data URL).
customer
object
customer.id
string
customer.name
string
customer.email
string or null
customer.phone
string or null
property
object or null
property.id
string
property.name
string or null
property.address
string or null
property.city
string or null
plan
object
plan.id
string
plan.name
string
plan.active
boolean
sourceQuote
object or null
sourceQuote.id
string
sourceQuote.identifier
string
sourceQuote.status
string
visits
array of object
visits[].id
string
visits[].termNumber
integer
visits[].sequence
integer
visits[].serviceTypeId
string or null
visits[].serviceName
string
visits[].serviceType
object or null
visits[].serviceType.id
string
visits[].serviceType.name
string
visits[].serviceType.color
string
visits[].dueMonth
string
YYYY-MM
visits[].dueDate
string or null
YYYY-MM-DD for a visit on a week cadence; null for month-based visits.
visits[].status
enum
DUE (not booked yet; its job may already wait in Dispatch Needs scheduling), SCHEDULED (the job has a date), COMPLETED, SKIPPED (cancelled or expired). One of DUE, SCHEDULED, COMPLETED, SKIPPED.
POST /organizations/{organizationId}/memberships/{membershipId}/reinstate
A PAUSED membership resumes now; a CANCELLED one whose term has not ended becomes ACTIVE again (skipped visits still ahead return to DUE, billing picks up at the next unbilled period on or after today and may create an invoice). 409 otherwise (an ended term is renewed instead).
How often the plan bills: WEEKLY (every 7 days), BIWEEKLY (every 2 weeks), EVERY_4_WEEKS (every 28 days), MONTHLY, QUARTERLY, SEMI_ANNUAL, ANNUAL, or ONE_TIME (once per term, at signup or renewal). Week-based periods run in days from the term's first day; the last one is clipped to the term and prorated by days. One of WEEKLY, BIWEEKLY, EVERY_4_WEEKS, MONTHLY, QUARTERLY, SEMI_ANNUAL, ANNUAL, ONE_TIME.
termMonths
integer
serviceDiscountPercent
number
materialDiscountPercent
number
priority
boolean
taxable
boolean
status
enum
ACTIVE (billing and visits run), PENDING (not started), PAUSED (nothing runs until pausedUntil or reinstated), CANCELLED, EXPIRED (term ended without renewal). One of ACTIVE, PENDING, PAUSED, CANCELLED, EXPIRED.
startDate
string
Signup date, YYYY-MM-DD.
termNumber
integer
Current term, 1 = the first.
termStartDate
string
endDate
string
Last day of the current term.
autoRenew
boolean
nextBillingDate
string or null
Start of the next period to bill; null when nothing more is due in the committed terms.
cancelledAt
string (date-time) or null
cancelReason
string or null
pausedUntil
string or null
pausedAt
string (date-time) or null
sourceQuoteId
string or null
businessUnitId
string or null
Business unit; null = none.
notes
string or null
createdAt
string (date-time)
updatedAt
string (date-time)
monthlyRecurringCents
integer
The price normalised to a month (MRR contribution).
visitUsage
object
Included visits of the current term.
visitUsage.included
integer
visitUsage.used
integer
Completed this term.
visitUsage.remaining
integer
Due or scheduled this term.
includedVisits
array of object
includedVisits[].serviceTypeId
string
includedVisits[].count
integer
includedVisits[].months
array of integer or null
includedVisits[].spacingMonths
integer or null
includedVisits[].everyWeeks
integer or null
includedVisits[].weekday
integer or null
soldByTechnicianId
string or null
The technician credited with the sale.
agreementTerms
string or null
The agreement the customer signed on a technician's phone.
agreementSignedBy
string or null
agreementSignedAt
string (date-time) or null
agreementSignature
string or null
Their drawn signature (PNG data URL).
customer
object
customer.id
string
customer.name
string
customer.email
string or null
customer.phone
string or null
property
object or null
property.id
string
property.name
string or null
property.address
string or null
property.city
string or null
plan
object
plan.id
string
plan.name
string
plan.active
boolean
sourceQuote
object or null
sourceQuote.id
string
sourceQuote.identifier
string
sourceQuote.status
string
visits
array of object
visits[].id
string
visits[].termNumber
integer
visits[].sequence
integer
visits[].serviceTypeId
string or null
visits[].serviceName
string
visits[].serviceType
object or null
visits[].serviceType.id
string
visits[].serviceType.name
string
visits[].serviceType.color
string
visits[].dueMonth
string
YYYY-MM
visits[].dueDate
string or null
YYYY-MM-DD for a visit on a week cadence; null for month-based visits.
visits[].status
enum
DUE (not booked yet; its job may already wait in Dispatch Needs scheduling), SCHEDULED (the job has a date), COMPLETED, SKIPPED (cancelled or expired). One of DUE, SCHEDULED, COMPLETED, SKIPPED.
POST /organizations/{organizationId}/memberships/{membershipId}/renew
Appends the next term now: an ACTIVE membership ending within 90 days gets its next term after the current end date (new included visits; billing continues); an EXPIRED one starts a new term today and its first period is invoiced. 409 for other states or earlier than 90 days before the end. Use GET /memberships?renewalWithinDays=30 for the Renewals view.
How often the plan bills: WEEKLY (every 7 days), BIWEEKLY (every 2 weeks), EVERY_4_WEEKS (every 28 days), MONTHLY, QUARTERLY, SEMI_ANNUAL, ANNUAL, or ONE_TIME (once per term, at signup or renewal). Week-based periods run in days from the term's first day; the last one is clipped to the term and prorated by days. One of WEEKLY, BIWEEKLY, EVERY_4_WEEKS, MONTHLY, QUARTERLY, SEMI_ANNUAL, ANNUAL, ONE_TIME.
termMonths
integer
serviceDiscountPercent
number
materialDiscountPercent
number
priority
boolean
taxable
boolean
status
enum
ACTIVE (billing and visits run), PENDING (not started), PAUSED (nothing runs until pausedUntil or reinstated), CANCELLED, EXPIRED (term ended without renewal). One of ACTIVE, PENDING, PAUSED, CANCELLED, EXPIRED.
startDate
string
Signup date, YYYY-MM-DD.
termNumber
integer
Current term, 1 = the first.
termStartDate
string
endDate
string
Last day of the current term.
autoRenew
boolean
nextBillingDate
string or null
Start of the next period to bill; null when nothing more is due in the committed terms.
cancelledAt
string (date-time) or null
cancelReason
string or null
pausedUntil
string or null
pausedAt
string (date-time) or null
sourceQuoteId
string or null
businessUnitId
string or null
Business unit; null = none.
notes
string or null
createdAt
string (date-time)
updatedAt
string (date-time)
monthlyRecurringCents
integer
The price normalised to a month (MRR contribution).
visitUsage
object
Included visits of the current term.
visitUsage.included
integer
visitUsage.used
integer
Completed this term.
visitUsage.remaining
integer
Due or scheduled this term.
includedVisits
array of object
includedVisits[].serviceTypeId
string
includedVisits[].count
integer
includedVisits[].months
array of integer or null
includedVisits[].spacingMonths
integer or null
includedVisits[].everyWeeks
integer or null
includedVisits[].weekday
integer or null
soldByTechnicianId
string or null
The technician credited with the sale.
agreementTerms
string or null
The agreement the customer signed on a technician's phone.
agreementSignedBy
string or null
agreementSignedAt
string (date-time) or null
agreementSignature
string or null
Their drawn signature (PNG data URL).
customer
object
customer.id
string
customer.name
string
customer.email
string or null
customer.phone
string or null
property
object or null
property.id
string
property.name
string or null
property.address
string or null
property.city
string or null
plan
object
plan.id
string
plan.name
string
plan.active
boolean
sourceQuote
object or null
sourceQuote.id
string
sourceQuote.identifier
string
sourceQuote.status
string
visits
array of object
visits[].id
string
visits[].termNumber
integer
visits[].sequence
integer
visits[].serviceTypeId
string or null
visits[].serviceName
string
visits[].serviceType
object or null
visits[].serviceType.id
string
visits[].serviceType.name
string
visits[].serviceType.color
string
visits[].dueMonth
string
YYYY-MM
visits[].dueDate
string or null
YYYY-MM-DD for a visit on a week cadence; null for month-based visits.
visits[].status
enum
DUE (not booked yet; its job may already wait in Dispatch Needs scheduling), SCHEDULED (the job has a date), COMPLETED, SKIPPED (cancelled or expired). One of DUE, SCHEDULED, COMPLETED, SKIPPED.
POST /organizations/{organizationId}/memberships/{membershipId}/cancel
DESTRUCTIVE for the customer's service: cancels with a reason, stops billing, marks every future DUE visit SKIPPED and cancels its unscheduled job. MONEY: finalInvoiceCents > 0 raises a final DRAFT invoice (e.g. an early-cancellation fee). Invoices already issued are untouched. Only ACTIVE, PAUSED or PENDING memberships (409).
Permission
memberships.cancel (Owner, Admin)
Risk
sensitive, OAuth scope servflo.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.
MCP tool
memberships_cancel (toolset sales)
Approval
Over MCP, this tool asks for your OK first (in the AI app when it supports it, otherwise in ServFlo). See Approvals.
How often the plan bills: WEEKLY (every 7 days), BIWEEKLY (every 2 weeks), EVERY_4_WEEKS (every 28 days), MONTHLY, QUARTERLY, SEMI_ANNUAL, ANNUAL, or ONE_TIME (once per term, at signup or renewal). Week-based periods run in days from the term's first day; the last one is clipped to the term and prorated by days. One of WEEKLY, BIWEEKLY, EVERY_4_WEEKS, MONTHLY, QUARTERLY, SEMI_ANNUAL, ANNUAL, ONE_TIME.
termMonths
integer
serviceDiscountPercent
number
materialDiscountPercent
number
priority
boolean
taxable
boolean
status
enum
ACTIVE (billing and visits run), PENDING (not started), PAUSED (nothing runs until pausedUntil or reinstated), CANCELLED, EXPIRED (term ended without renewal). One of ACTIVE, PENDING, PAUSED, CANCELLED, EXPIRED.
startDate
string
Signup date, YYYY-MM-DD.
termNumber
integer
Current term, 1 = the first.
termStartDate
string
endDate
string
Last day of the current term.
autoRenew
boolean
nextBillingDate
string or null
Start of the next period to bill; null when nothing more is due in the committed terms.
cancelledAt
string (date-time) or null
cancelReason
string or null
pausedUntil
string or null
pausedAt
string (date-time) or null
sourceQuoteId
string or null
businessUnitId
string or null
Business unit; null = none.
notes
string or null
createdAt
string (date-time)
updatedAt
string (date-time)
monthlyRecurringCents
integer
The price normalised to a month (MRR contribution).
visitUsage
object
Included visits of the current term.
visitUsage.included
integer
visitUsage.used
integer
Completed this term.
visitUsage.remaining
integer
Due or scheduled this term.
includedVisits
array of object
includedVisits[].serviceTypeId
string
includedVisits[].count
integer
includedVisits[].months
array of integer or null
includedVisits[].spacingMonths
integer or null
includedVisits[].everyWeeks
integer or null
includedVisits[].weekday
integer or null
soldByTechnicianId
string or null
The technician credited with the sale.
agreementTerms
string or null
The agreement the customer signed on a technician's phone.
agreementSignedBy
string or null
agreementSignedAt
string (date-time) or null
agreementSignature
string or null
Their drawn signature (PNG data URL).
customer
object
customer.id
string
customer.name
string
customer.email
string or null
customer.phone
string or null
property
object or null
property.id
string
property.name
string or null
property.address
string or null
property.city
string or null
plan
object
plan.id
string
plan.name
string
plan.active
boolean
sourceQuote
object or null
sourceQuote.id
string
sourceQuote.identifier
string
sourceQuote.status
string
visits
array of object
visits[].id
string
visits[].termNumber
integer
visits[].sequence
integer
visits[].serviceTypeId
string or null
visits[].serviceName
string
visits[].serviceType
object or null
visits[].serviceType.id
string
visits[].serviceType.name
string
visits[].serviceType.color
string
visits[].dueMonth
string
YYYY-MM
visits[].dueDate
string or null
YYYY-MM-DD for a visit on a week cadence; null for month-based visits.
visits[].status
enum
DUE (not booked yet; its job may already wait in Dispatch Needs scheduling), SCHEDULED (the job has a date), COMPLETED, SKIPPED (cancelled or expired). One of DUE, SCHEDULED, COMPLETED, SKIPPED.
POST /organizations/{organizationId}/memberships/tick
Money: runs the membership scheduler for this organization now (it also runs hourly): invoices billing periods that are due (once per period, never twice), turns member visits whose window opened into unscheduled jobs, renews or expires memberships at their end date and resumes ended pauses. Idempotent: running it again changes nothing until something falls due.
Permission
memberships.plans.manage (Owner, Admin)
Risk
sensitive, OAuth scope servflo.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.
MCP tool
memberships_runTick (toolset sales)
Approval
Over MCP, this tool asks for your OK first (in the AI app when it supports it, otherwise in ServFlo). See Approvals.