openapi: 3.2.0 info: title: Cacheflow Migration API version: 0.0.3 servers: - url: https://api.getcacheflow.com description: 'Production. Calls are tenant-routed: send Host: .api.getcacheflow.com (per github.com/getcacheflow/api-examples SETUP.md). Host no longer resolves as of 2026-08-13.' - url: https://api.sandbox.getcacheflow.com description: Sandbox. Tenant-routed as .api.sandbox.getcacheflow.com. Host no longer resolves as of 2026-08-13. tags: - name: Migration paths: /api/latest/settings/stripe/subscriptions/migrations/convert: post: tags: - Migration summary: Convert a proposal to a subscription operationId: convert requestBody: content: application/json: schema: $ref: '#/components/schemas/ProposalConversionRequest' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/StripeMigrationResponse' /api/latest/settings/stripe/subscriptions/migrations: post: tags: - Migration summary: Migrate subscription to Cacheflow operationId: migrate requestBody: content: application/json: schema: $ref: '#/components/schemas/StripeMigrationRequest' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/StripeMigrationResponse' components: schemas: ItemLevelRequest: type: object properties: visibilityOverride: type: boolean start: type: integer format: int32 Money: type: object properties: amount: type: integer format: int64 scale: type: integer format: int32 formattedAmount: type: string currency: type: string description: Total list amount for this level. null for usage. Address: type: object properties: id: type: string format: uuid createdAt: type: string format: date-time readOnly: true createdBy: type: string updatedAt: type: string format: date-time readOnly: true updatedBy: type: string readOnly: true name: type: string type: type: string streetAddress: type: string subAddress: type: string otherAddress: type: string city: type: string region: type: string regionIso: type: string postalCode: type: string country: type: string countryIso: type: string verifiedAt: type: string format: date-time ProposalItemRequest: type: object properties: id: type: string format: uuid name: type: string description: type: string startDate: type: string format: date endDate: type: string format: date quantity: type: number productId: type: string format: uuid quantityOverrides: type: array deprecated: true items: $ref: '#/components/schemas/QuantityOverride' overrides: type: array deprecated: true items: $ref: '#/components/schemas/ItemOverrideRequest' levels: type: array items: $ref: '#/components/schemas/ItemLevelRequest' schedules: type: array items: $ref: '#/components/schemas/ItemScheduleRequest' levelVisibility: type: string enum: - all - active - active_plus_one - active_plus_three - active_plus_prior_next - active_plus_prior_next_three ItemScheduleLevelRequest: type: object properties: price: $ref: '#/components/schemas/Money' listPrice: $ref: '#/components/schemas/Money' description: Level price and discount info. Required for tiered products. ContractOptions: type: object properties: contractStatus: type: string enum: - active - paused - cancelled - ended markPastSchedulesAsPaid: type: boolean markSchedulesAsInvoiced: type: boolean paymentMethodSource: type: string paymentMethodId: type: string paymentMethodType: type: string ProposalAttachment: type: object properties: id: type: string format: uuid createdAt: type: string format: date-time readOnly: true createdBy: type: string updatedAt: type: string format: date-time readOnly: true updatedBy: type: string readOnly: true type: type: string enum: - document - link attachmentConfigId: type: string format: uuid documentId: type: string format: uuid documentVersion: $ref: '#/components/schemas/DocumentVersion' inEnvelope: type: boolean name: type: string linkUrl: type: string CreateProposalRequest: type: object properties: source: type: string enum: - manual - close - plaid - stripe - hubspot - salesforce - avalara - quickbooks - profitwell - netsuite - google - warmly - zapier - cacheflow_checkout externalId: type: string defaultBillingPeriod: type: string enum: - month - quarter - halfyear - year name: maxLength: 255 minLength: 0 type: string description: maxLength: 255 minLength: 0 type: string proposalType: type: string enum: - initial - change - renewal - template startDate: type: string format: date expiresAt: type: string format: date proposalNumber: type: string contactIds: type: array items: type: string format: uuid proposalItems: type: array items: $ref: '#/components/schemas/ProposalItemRequest' contacts: type: array items: $ref: '#/components/schemas/CreateContactRequest' termType: type: string enum: - month - quarter - year termQty: type: integer format: int32 freeMonths: type: integer format: int32 status: type: string enum: - draft - pending_approval - approved - schedule_selection - payment_selection - active - pending_renewal - accepted - expired - cancelled - deleted customTerms: type: string customerId: type: string format: uuid customer: $ref: '#/components/schemas/CustomerRequest' billToId: type: string format: uuid shipFromId: type: string format: uuid options: type: object additionalProperties: type: boolean attachments: type: array items: $ref: '#/components/schemas/ProposalAttachment' paymentTermType: type: string enum: - net_15 - net_30 - net_45 - net_60 - net_75 - net_90 - upon_receipt - end_of_month - on_15th ownerId: type: string format: uuid billingPeriods: type: array items: type: string enum: - month - quarter - halfyear - year currency: type: string autoRenewable: type: boolean autoRenewalTermLength: type: integer format: int32 externalSource: $ref: '#/components/schemas/ExternalSource' purchaseOrderNumber: type: string ItemScheduleRequest: type: object properties: id: type: string description: ID used to reference an existing schedule in bulk requests. format: uuid billingPeriod: type: string enum: - month - quarter - halfyear - year productId: type: string description: Product id for a specific version of the product. Must have the same root as the parent Item. format: uuid startIndex: type: integer description: Start at regular payment index. Used for relative dates to the start date. format: int32 endIndex: type: integer description: Inclusive end at regular payment index. Used for relative dates to the start date. format: int32 price: $ref: '#/components/schemas/Money' listPrice: $ref: '#/components/schemas/Money' quantity: type: number description: Quantity discount: type: boolean description: Indicates whether the price should be considered a discount. May not be true if price is higher than listPrice. levels: type: array description: Level price and discount info. Required for tiered products. items: $ref: '#/components/schemas/ItemScheduleLevelRequest' StripeMigrationResponse: type: object properties: subscriptionId: type: string proposal: $ref: '#/components/schemas/ObjectReference' contract: $ref: '#/components/schemas/ObjectReference' customer: $ref: '#/components/schemas/ObjectReference' status: type: string enum: - not_processed - success - failed error: type: string ObjectReference: type: object properties: referenceType: type: string enum: - account - apiwebhook - apitoken - approvalgroup - attachmentconfig - authidentity - billingschedule - companyInfo - connectorSyncEvent - contact - contentTemplate - contract - contractitem - contractitemlevel - currency - customer - docusignaccount - document - documentversion - group - invite - invoice - invoiceConfiguration - organization - orgconfig - orgidentitytoken - payment - paymentMethod - paymentSchedule - paymentTerm - pricebook - pricebookentry - product - productlevel - productusage - proposal - proposalapprovalrule - proposalevent - proposalitem - proposaliteminterval - proposalitemlevel - proposaloption - refund - renewalconfiguration - signature - signingdocument - transfer - transferevent - unit - user id: type: string format: uuid uri: type: string name: type: string type: type: string writeOnly: true enum: - account - apiwebhook - apitoken - approvalgroup - attachmentconfig - authidentity - billingschedule - companyInfo - connectorSyncEvent - contact - contentTemplate - contract - contractitem - contractitemlevel - currency - customer - docusignaccount - document - documentversion - group - invite - invoice - invoiceConfiguration - organization - orgconfig - orgidentitytoken - payment - paymentMethod - paymentSchedule - paymentTerm - pricebook - pricebookentry - product - productlevel - productusage - proposal - proposalapprovalrule - proposalevent - proposalitem - proposaliteminterval - proposalitemlevel - proposaloption - refund - renewalconfiguration - signature - signingdocument - transfer - transferevent - unit - user ProposalConversionRequest: type: object properties: proposalId: type: string format: uuid contractOptions: $ref: '#/components/schemas/ContractOptions' customerId: type: string format: uuid externalCustomerId: type: string ExternalSource: required: - sourceId - sourceType type: object properties: sourceType: type: string enum: - manual - close - plaid - stripe - hubspot - salesforce - avalara - quickbooks - profitwell - netsuite - google - warmly - zapier - cacheflow_checkout sourceId: type: string sourceLink: type: string ItemLevelOverrideRequest: required: - level - price type: object properties: price: $ref: '#/components/schemas/Money' listPrice: $ref: '#/components/schemas/Money' level: type: integer format: int32 CustomerRequest: type: object properties: externalId: type: string source: type: string enum: - manual - close - plaid - stripe - hubspot - salesforce - avalara - quickbooks - profitwell - netsuite - google - warmly - zapier - cacheflow_checkout name: type: string contacts: type: array items: $ref: '#/components/schemas/CreateContactRequest' tin: type: string taxUseCode: type: string enum: - A - B - C - D - E - F - G - H - I - J - K - L - M - N - P - Q - R defaultCurrency: type: string billingAddress: $ref: '#/components/schemas/Address' shippingAddress: $ref: '#/components/schemas/Address' billingContact: $ref: '#/components/schemas/CreateContactRequest' billingContactId: type: string format: uuid taxExempt: type: boolean partner: type: boolean externalSources: type: array items: $ref: '#/components/schemas/ExternalSource' referenceType: type: string enum: - account - apiwebhook - apitoken - approvalgroup - attachmentconfig - authidentity - billingschedule - companyInfo - connectorSyncEvent - contact - contentTemplate - contract - contractitem - contractitemlevel - currency - customer - docusignaccount - document - documentversion - group - invite - invoice - invoiceConfiguration - organization - orgconfig - orgidentitytoken - payment - paymentMethod - paymentSchedule - paymentTerm - pricebook - pricebookentry - product - productlevel - productusage - proposal - proposalapprovalrule - proposalevent - proposalitem - proposaliteminterval - proposalitemlevel - proposaloption - refund - renewalconfiguration - signature - signingdocument - transfer - transferevent - unit - user DocumentVersion: type: object properties: id: type: string format: uuid createdAt: type: string format: date-time readOnly: true createdBy: type: string updatedAt: type: string format: date-time readOnly: true updatedBy: type: string readOnly: true versionNumber: type: integer format: int32 fileName: type: string url: type: string documentId: type: string format: uuid StripeMigrationRequest: type: object properties: subscriptionId: type: string autoRenewable: type: boolean autoRenewalTermLength: type: integer format: int32 createProposalRequest: $ref: '#/components/schemas/CreateProposalRequest' skipContract: type: boolean contractOptions: $ref: '#/components/schemas/ContractOptions' customerId: type: string format: uuid externalCustomerId: type: string QuantityOverride: required: - billingPeriod - quantity type: object properties: billingPeriod: type: string enum: - month - quarter - halfyear - year quantity: type: number startIndex: type: integer format: int32 duration: type: integer format: int32 ItemOverrideRequest: required: - discount type: object properties: price: $ref: '#/components/schemas/Money' listPrice: $ref: '#/components/schemas/Money' discount: type: boolean billingPeriod: type: string enum: - month - quarter - halfyear - year startIndex: type: integer format: int32 duration: type: integer format: int32 levels: type: array items: $ref: '#/components/schemas/ItemLevelOverrideRequest' CreateContactRequest: required: - email - firstName - lastName type: object properties: externalId: type: string source: type: string enum: - manual - close - plaid - stripe - hubspot - salesforce - avalara - quickbooks - profitwell - netsuite - google - warmly - zapier - cacheflow_checkout firstName: type: string lastName: type: string email: type: string role: type: string externalSources: type: array items: $ref: '#/components/schemas/ExternalSource'