Change an organization's legacy plan (internal) Deprecated

Add MCP server to your AI tool

Allow AI tools and LLMs to interact with the API documentation portal through MCP.

MCP server URL

https://docs.usehearsay.com/mcp

Standard setup for AI tools providing an mcp.json file

mcp.json
{
  "integrations MCP server": {
    "url": "https://docs.usehearsay.com/mcp"
  }
}

Close
POST /admin/payment/update-org-plan

Moves the organization (given by orgId, or by its owner's email orgOwnerEmail) to the legacy subscription product productId, invoicing the prorated difference at once, and returns the organization's details. Legacy billing only; scheduled for removal. Returns 404 when the organization or owner is not found. Super admin only.

application/json

Body Required

  • orgId string

    required if orgOwnerEmail not sent

  • orgOwnerEmail string

    required if orgId not sent

  • productId string Required

Responses

  • 200 application/json
    Hide response attributes Show response attributes object
    • data object Required
      Hide data attributes Show data attributes object
      • organization object Required
        Hide organization attributes Show organization attributes object
        • createdAt string(date-time) Required
        • updatedAt string(date-time) Required
        • id string Required
        • name string Required
        • slug string Required
        • email string Required
        • contact string Required
        • city string Required
        • state string Required
        • country string Required
        • description string Required
        • phone array[string] Required
        • isActive boolean Required
        • isPriority boolean
        • activePlan object Required

          The full record on routes that load it; null (or an empty list) on routes that do not.

          Hide activePlan attributes Show activePlan attributes object
          • createdAt string(date-time) Required
          • updatedAt string(date-time) Required
          • id string Required
          • subscription object | null Required

            Not loaded on public routes, so always null there. Only the internal admin organization report loads it.

          • relatedSubscription array[object] | null Required

            Not loaded by any route, so always null or an empty list.

          • organization object | null Required

            Not loaded by any route, so always null.

          • seats number Required
          • seatsUsed number Required
          • devices number Required
          • deviceUsed number Required
          • storage number Required

            Storage in bytes

          • storageUsed number Required

            Storage used in bytes

          • payments array[object] | null Required

            Not loaded by any route, so always null or an empty list.

          • type string Required

            Values are admin, free, limited-access, trial, tier1, tier2, tier3, tier4, tier5, tier6, or tier7.

          • isActive boolean Required
          • isBetweenPlanChanges boolean Required
          • storageInKb number Required
          • storageUsedInKb number Required
          • storageInMb number Required
          • storageUsedInMb number Required
          • storageInGb number Required
          • storageUsedInGb number Required
          • storageInTb number Required
          • storageUsedInTb number Required
          • isFreePlan boolean Required
          • remainingSeats number Required
          • remainingDevices number Required
          • remainingStorage number Required

            Storage left in bytes (storage minus storageUsed).

        • metadata object Required
        • type string Required
        • version string Required

          Values are v1, v2, eu, or ca.

      • permission object Required
        Hide permission attributes Show permission attributes object
        • createdAt string(date-time) Required
        • updatedAt string(date-time) Required
        • id string Required
        • user object Required

          The full record on routes that load it; null (or an empty list) on routes that do not.

          Hide user attributes Show user attributes object
          • createdAt string(date-time) Required
          • updatedAt string(date-time) Required
          • id string Required
          • name string Required
          • email string Required
          • phone array[string] Required
          • isActive boolean Required
          • isEmailVerified boolean Required
          • lastActive string(date-time) Required
          • roles array[string] Required
          • avatar object Required

            The full record on routes that load it; null (or an empty list) on routes that do not.

            Hide avatar attributes Show avatar attributes object
            • createdAt string(date-time) Required
            • updatedAt string(date-time) Required
            • id string Required
            • name string Required
            • providerId string Required
            • convertedName string | null Required
            • convertedProviderId string Required
            • provider string Required
            • size number Required

              Size in bytes

            • transferState number | null Required
          • onboardingStatus string | null Required
          • userType string | null Required
          • firstName string Required
          • lastName string Required
          • initials string Required
          • userOrganizations array[object]

            Only filled on the signed-in user's own profile; absent or empty on a user nested in another record.

        • role string Required

          Values are user, client, employee, billing, full_access, admin, owner, or member.

        • organization object | null Required

          Not loaded by any route, so always null.

        • lastActiveAt string(date-time) | null Required
      • billing object Required

        The org's plan, limits and resolved prices. null when the org is billed by the legacy model — either it has not been migrated to case billing or the feature is off.

        Hide billing attributes Show billing attributes object
        • tier string Required

          Values are public, solo, firm, or firm-plus.

        • tierName string Required
        • billingMode string Required

          Values are payg, per-source, or flat-case.

        • cadence string Required

          Values are monthly or annual.

        • baseFeeCents number Required

          Platform fee for one period at this cadence, in cents

        • paymentMethodOnFile boolean Required
        • supportTier string Required
        • limits object Required
          Hide limits attributes Show limits attributes object
          • seatCap number | null Required

            null = unlimited

          • storageGB number Required
          • perCaseSourceCap number | null Required

            Provisioned, not enforced — display only

        • features array[string] Required

          Feature keys enabled for this tier

        • prices array[object] Required
          Hide prices attributes Show prices attributes object
          • skuKey string Required

            Values are collection.phone, collection.social, collection.email, collection.ai-chat, collection.financial, collection.discord, collection.reddit, collection.linkedin, collection.legal, collection.file, collection.other, case.flat, case.pro-upgrade, addon.kit-rental, addon.laptop-rental, addon.laptop-rental-setup, addon.managed-service, addon.shipping, addon.live-bank, plan.base, source.per, ai.tokens-overage, adjustment.manual, or adjustment.discount.

          • name string Required
          • unitAmountCents number Required

            What this org is charged per unit, in cents

          • included boolean Required

            Bundled by the plan — charged at 0, not billed

          • listAmountCents number | null Required

            What an included item would otherwise have cost

          • overridden boolean Required

            Set by this org's negotiated price rather than the plan's catalog rate

          • recurrence string | null Required

            null for a one-time charge; otherwise how often it repeats

            Values are monthly or semiannual.

          • freeFirstPeriod boolean Required

            First period of a recurring item costs 0

        • overrides object Required

          This org's negotiated exceptions, as stored. An absent SKU means the plan's catalog rate applies — read prices for what is actually charged.

    • statusCode number Required
    • timestamp string(date-time) Required
POST /admin/payment/update-org-plan
curl \
 --request POST 'http://api.example.com/admin/payment/update-org-plan' \
 --header "Authorization: Bearer $ACCESS_TOKEN" \
 --header "Content-Type: application/json" \
 --data '{
  "orgId": "string",
  "orgOwnerEmail": "string",
  "productId": "string"
}'
Request examples
{
  "orgId": "string",
  "orgOwnerEmail": "string",
  "productId": "string"
}
Response examples (200)
{
  "data": {
    "organization": {
      "createdAt": "2026-01-15T14:30:00.000Z",
      "updatedAt": "2026-01-15T14:30:00.000Z",
      "id": "507f1f77bcf86cd799439011",
      "name": "Example Law LLP",
      "slug": "example-law-llp",
      "email": "office@example.com",
      "contact": "Jane Doe",
      "city": "New York",
      "state": "NY",
      "country": "US",
      "description": "Litigation practice",
      "phone": [
        "+15555550100"
      ],
      "logo": "https://files.example.com/logo.png",
      "isActive": true,
      "isPriority": false,
      "activePlan": {
        "createdAt": "2026-01-15T14:30:00.000Z",
        "updatedAt": "2026-01-15T14:30:00.000Z",
        "id": "507f1f77bcf86cd799439011",
        "subscription": {},
        "relatedSubscription": [
          {}
        ],
        "organization": {},
        "seats": 5,
        "seatsUsed": 3,
        "devices": 10,
        "deviceUsed": 4,
        "storage": 100000000000,
        "storageUsed": 12000000000,
        "payments": [
          {}
        ],
        "type": "admin",
        "isActive": true,
        "isBetweenPlanChanges": false,
        "storageInKb": 100000000,
        "storageUsedInKb": 12000000,
        "storageInMb": 100000,
        "storageUsedInMb": 12000,
        "storageInGb": 100,
        "storageUsedInGb": 12,
        "storageInTb": 0.1,
        "storageUsedInTb": 0.012,
        "isFreePlan": false,
        "remainingSeats": 2,
        "remainingDevices": 6,
        "remainingStorage": 88000000000
      },
      "metadata": {},
      "type": "law_firm",
      "version": "v1"
    },
    "permission": {
      "createdAt": "2026-01-15T14:30:00.000Z",
      "updatedAt": "2026-01-15T14:30:00.000Z",
      "id": "507f1f77bcf86cd799439011",
      "user": {
        "createdAt": "2026-01-15T14:30:00.000Z",
        "updatedAt": "2026-01-15T14:30:00.000Z",
        "id": "507f1f77bcf86cd799439011",
        "name": "Jane Doe",
        "email": "jane.doe@example.com",
        "phone": [
          "+15555550100"
        ],
        "isActive": true,
        "isEmailVerified": true,
        "lastActive": "2026-01-15T14:30:00.000Z",
        "roles": [
          "user"
        ],
        "avatar": {
          "createdAt": "2026-01-15T14:30:00.000Z",
          "updatedAt": "2026-01-15T14:30:00.000Z",
          "id": "507f1f77bcf86cd799439011",
          "name": "photo.heic",
          "providerId": "uploads/507f1f77bcf86cd799439011/photo.heic",
          "convertedName": "photo.jpg",
          "convertedProviderId": "uploads/507f1f77bcf86cd799439011/photo.jpg",
          "provider": "s3",
          "size": 204800,
          "transferState": 42.0
        },
        "onboardingStatus": "completed",
        "userType": "attorney",
        "firstName": "Jane",
        "lastName": "Doe",
        "initials": "JD",
        "userOrganizations": [
          {}
        ]
      },
      "role": "member",
      "organization": {},
      "lastActiveAt": "2026-01-15T14:30:00.000Z"
    },
    "billing": {
      "tier": "firm",
      "tierName": "Firm",
      "billingMode": "per-source",
      "cadence": "monthly",
      "baseFeeCents": 24900,
      "paymentMethodOnFile": true,
      "supportTier": "next-day",
      "limits": {
        "seatCap": 10,
        "storageGB": 5000,
        "perCaseSourceCap": 42.0
      },
      "features": [
        "rsmf",
        "ai",
        "mcp",
        "whiteLabel"
      ],
      "prices": [
        {
          "skuKey": "collection.phone",
          "name": "Phone collection",
          "unitAmountCents": 17900,
          "included": false,
          "listAmountCents": 42.0,
          "overridden": false,
          "recurrence": "monthly",
          "freeFirstPeriod": false
        }
      ],
      "overrides": {
        "skuUnitAmountCents": {
          "collection.phone": 9900
        }
      }
    }
  },
  "statusCode": 200,
  "timestamp": "2026-01-15T10:15:00.000Z"
}