> ## Documentation Index
> Fetch the complete documentation index at: https://docs.nautilus.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Cancellations

> Membership cancellation analytics for the organization bound to your API key: voluntary vs involuntary totals, a per-status reason breakdown (with share and tenure), and tenure-at-cancellation stats.

Available for eligible organizations; a tenant-scoped API key is required. See [key types](/api-reference/introduction#key-types).

<RequestExample>
  ```bash All-time theme={null}
  curl "https://app.nautilus.co/api/v1/cancellations" \
    -H "Authorization: Bearer YOUR_API_KEY"
  ```

  ```bash Date range theme={null}
  curl "https://app.nautilus.co/api/v1/cancellations?start=2025-01-01&end=2025-12-31" \
    -H "Authorization: Bearer YOUR_API_KEY"
  ```
</RequestExample>

## Response

* **`totals`** — churned memberships and the distinct customers behind them (a customer can hold several memberships), plus the voluntary/involuntary split and percentages.
* **`reasons`** — one row per terminal membership status, with its share of churn and average/median tenure. `voluntary` is a member-initiated cancellation; `involuntary` is a payment or authorizer failure.
* **`tenure`** — days from signup to cancellation, overall and by churn type, plus day-range buckets.

## Notes

Tenure is reported only for members with a known signup date — read `tenure.*.membersWithKnownTenure` as that subset's size. A membership counts as churned once its terminal status is anything other than active, suspended, or an in-progress card update.

## Errors

* **400** — cancellation analytics are not available for this organization.
* **401** — missing or invalid API key.


## OpenAPI

````yaml GET /api/v1/cancellations
openapi: 3.1.0
info:
  title: Nautilus Public API
  version: 1.0.0
  description: >-
    Tenant-scoped public API. Except for /api/v1/openapi.json, requests use a
    Clerk tenant API key as a Bearer token. The key's organizationId is the sole
    tenant scope; organization IDs supplied by callers are never accepted.
    Detail endpoints deliberately return 404 for both missing and cross-tenant
    records. Canonical collections use the standard envelope and endpoint-bound
    cursor pagination. Timestamps are UTC ISO 8601 values and monetary amounts
    ending in Cents are integer cents. Responses use narrow serializers and
    exclude credentials, API keys, provider configuration, access tokens,
    webhook secrets, raw provider payloads, and internal workflow or activity
    data.
servers:
  - url: https://app.nautilus.co
security:
  - tenantApiKey: []
tags:
  - name: Contract
  - name: Cancellations
  - name: Sites
  - name: Products
  - name: Checkout links
  - name: Purchases
  - name: Contact lists
  - name: Contacts
  - name: Marketing
  - name: Forms
  - name: Vouchers
  - name: Links
  - name: Automations
  - name: Surveys
  - name: Cases
  - name: Sonny's POS
  - name: Analytics
  - name: Messaging
  - name: Legacy
    description: Deprecated noncanonical endpoints retained for compatibility.
paths:
  /api/v1/cancellations:
    get:
      tags:
        - Cancellations
        - Legacy
      summary: Cancellations
      description: >-
        Membership cancellation analytics for the organization bound to your API
        key: voluntary vs involuntary totals, a per-status reason breakdown
        (with share and tenure), and tenure-at-cancellation stats.


        Available for eligible organizations; a tenant-scoped API key is
        required. See [key types](/api-reference/introduction#key-types).
      operationId: getCancellations
      parameters:
        - name: start
          in: query
          required: false
          description: >-
            Inclusive lower bound on the date (ISO 8601 date or datetime).
            Invalid values are ignored. Omit for all-time.
          schema:
            type: string
            format: date-time
        - name: end
          in: query
          required: false
          description: >-
            Inclusive upper bound on the date (ISO 8601 date or datetime).
            Invalid values are ignored. Omit for all-time.
          schema:
            type: string
            format: date-time
      responses:
        '200':
          description: Cancellation analytics for the tenant-scoped organization.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CancellationsResponse'
              example:
                organizationId: org_2abcXYZ123
                dateRange:
                  start: null
                  end: null
                source: membership_status
                available: true
                totals:
                  churnedMemberships: 133799
                  churnedCustomers: 118360
                  voluntary: 100123
                  involuntary: 33676
                  voluntaryPct: 74.8
                  involuntaryPct: 25.2
                reasons:
                  - reason: Cancelled
                    churnType: voluntary
                    count: 100123
                    pct: 74.8
                    avgTenureDays: 183.9
                    medianTenureDays: 94
                  - reason: Payment Retries Exceeded
                    churnType: involuntary
                    count: 23648
                    pct: 17.7
                    avgTenureDays: 175.8
                    medianTenureDays: 92.3
                tenure:
                  overall:
                    membersWithKnownTenure: 130018
                    avgDays: 180.5
                    medianDays: 92.6
                    p90Days: 456.9
                  voluntary:
                    membersWithKnownTenure: 97500
                    avgDays: 190.2
                    medianDays: 99
                    p90Days: 470
                  involuntary:
                    membersWithKnownTenure: 32518
                    avgDays: 151
                    medianDays: 78
                    p90Days: 410
                  buckets:
                    - bucket: 0-30
                      count: 19518
                    - bucket: 31-90
                      count: 42347
        '400':
          description: Cancellation analytics are not available for this organization.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: The API key is missing or invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      deprecated: true
components:
  schemas:
    CancellationsResponse:
      type: object
      title: Cancellations
      required:
        - organizationId
        - dateRange
        - source
        - available
        - totals
        - reasons
        - tenure
      properties:
        organizationId:
          type: string
        dateRange:
          $ref: '#/components/schemas/DateRange'
        source:
          type: string
          enum:
            - membership_status
        available:
          type: boolean
        totals:
          $ref: '#/components/schemas/CancellationTotals'
        reasons:
          type: array
          items:
            $ref: '#/components/schemas/CancellationReasonRow'
        tenure:
          type: object
          required:
            - overall
            - voluntary
            - involuntary
            - buckets
          properties:
            overall:
              $ref: '#/components/schemas/TenureStats'
            voluntary:
              $ref: '#/components/schemas/TenureStats'
            involuntary:
              $ref: '#/components/schemas/TenureStats'
            buckets:
              type: array
              items:
                $ref: '#/components/schemas/TenureBucket'
    Error:
      type: object
      additionalProperties: false
      properties:
        error:
          type: string
      required:
        - error
    DateRange:
      type: object
      title: Date range
      required:
        - start
        - end
      properties:
        start:
          type:
            - string
            - 'null'
          format: date-time
          description: Parsed `start` filter, or null when omitted.
        end:
          type:
            - string
            - 'null'
          format: date-time
          description: Parsed `end` filter, or null when omitted.
    CancellationTotals:
      type: object
      title: Cancellation totals
      required:
        - churnedMemberships
        - churnedCustomers
        - voluntary
        - involuntary
        - voluntaryPct
        - involuntaryPct
      properties:
        churnedMemberships:
          type: integer
        churnedCustomers:
          type: integer
          description: >-
            Distinct customers behind the churned memberships (<=
            churnedMemberships).
        voluntary:
          type: integer
        involuntary:
          type: integer
        voluntaryPct:
          type: number
        involuntaryPct:
          type: number
    CancellationReasonRow:
      type: object
      title: Cancellation reason row
      description: 'One terminal membership status: count, share, and tenure.'
      required:
        - reason
        - churnType
        - count
        - pct
        - avgTenureDays
        - medianTenureDays
      properties:
        reason:
          type: string
          description: >-
            Terminal membership status, e.g. `Cancelled`, `Payment Retries
            Exceeded`.
        churnType:
          type: string
          enum:
            - voluntary
            - involuntary
        count:
          type: integer
        pct:
          type: number
          description: Share of total churn, to one decimal.
        avgTenureDays:
          type:
            - number
            - 'null'
          description: Null when no member in this row has a known signup.
        medianTenureDays:
          type:
            - number
            - 'null'
    TenureStats:
      type: object
      title: Tenure stats
      description: Tenure-at-cancellation stats over members with a known signup date.
      required:
        - membersWithKnownTenure
        - avgDays
        - medianDays
        - p90Days
      properties:
        membersWithKnownTenure:
          type: integer
          description: Members with a known signup (the subset these stats cover).
        avgDays:
          type:
            - number
            - 'null'
        medianDays:
          type:
            - number
            - 'null'
        p90Days:
          type:
            - number
            - 'null'
    TenureBucket:
      type: object
      title: Tenure bucket
      required:
        - bucket
        - count
      properties:
        bucket:
          type: string
          enum:
            - 0-30
            - 31-90
            - 91-180
            - 181-365
            - 365+
        count:
          type: integer
  securitySchemes:
    tenantApiKey:
      type: http
      scheme: bearer
      bearerFormat: Clerk tenant API key
      description: >-
        Clerk tenant API key. The organizationId encoded by the key is the exact
        and only tenant scope.

````