The Subscriptions API tracks recurring charges such as streaming services, SaaS tools, and utilities. A subscription’sDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/soker90/finper/llms.txt
Use this file to discover all available pages before exploring further.
nextPaymentDate is always calculated from the most recently linked transaction — it is never manually set. When a new transaction is created elsewhere in the API, a background process automatically checks whether it matches a subscription’s expected payment window and creates a candidate for the user to confirm or discard.
Cycle values
Thecycle field is a number — an integer between 1 and 60 representing the number of months between payments. Pass the integer directly; there are no named string values.
| Example value | Meaning |
|---|---|
1 | Every 1 month (monthly) |
2 | Every 2 months |
3 | Every 3 months (quarterly) |
6 | Every 6 months |
12 | Every 12 months (annually) |
1 to 60 is accepted.
GET /api/subscriptions
List all subscriptions for the authenticated user, ordered bynextPaymentDate ascending. Subscriptions with no linked transactions (where nextPaymentDate is null) appear first.
POST /api/subscriptions
Create a new subscription.nextPaymentDate always starts as null and is populated only after transactions are linked.
Display name for the subscription (e.g.
"Netflix", "Spotify").Expected charge amount per cycle. Must be positive.
Number of months between payments. Any integer from
1 to 60. For example: 1 = monthly, 3 = quarterly, 12 = annually.ID of the expense category. Must exist and belong to the authenticated user.
ID of the account the charge comes from. Must exist and belong to the authenticated user.
URL of the service’s logo. Must be a valid URI or an empty string.
ISO 4217 currency code (e.g.
"EUR", "USD"). Optional.PUT /api/subscriptions/:id
Edit a subscription. All fields are optional; only provided fields are updated.Subscription ID.
New display name.
New charge amount. Must be positive.
New billing cycle in months (1–60).
New category ID (existence is validated).
New account ID (existence is validated).
New logo URL or empty string to clear.
DELETE /api/subscriptions/:id
Delete a subscription. Does not remove linked transactions — they retain theirsubscriptionId field but the referenced subscription no longer exists.
Subscription ID.
GET /api/subscriptions/:id/transactions
List all transactions already linked to a subscription, sorted by date descending.Subscription ID.
category and account fields.
GET /api/subscriptions/:id/matching-transactions
Return up to 50 unlinked transactions that share the samecategory and account as the subscription. Sorted by date descending. Useful for manually identifying historical payments to backfill.
Subscription ID.
POST /api/subscriptions/:id/link-transactions
Link one or more transactions to a subscription in a single batch operation. After linking,nextPaymentDate is recalculated from the most recent linked transaction.
Subscription ID.
Non-empty array of transaction IDs to link. Returns HTTP 422 if the array is empty or missing.
DELETE /api/subscriptions/:id/unlink-transactions/:transactionId
Remove the link between a single transaction and a subscription. The transaction itself is not deleted.nextPaymentDate is recalculated after unlinking.
Subscription ID.
ID of the transaction to unlink.
GET /api/subscriptions/candidates
List all subscription candidates for the authenticated user. Candidates are temporary records created automatically when a new transaction’s date falls within ±7 days of a subscription’snextPaymentDate for the same account and category. Sorted by createdAt descending (newest first).
This route must be declared before the
/:id route in the Express router so that the literal path segment candidates is not captured as a dynamic :id parameter.POST /api/subscriptions/candidates/:id/assign
Confirm a candidate by linking its transaction to the chosen subscription. This:- Sets
transaction.subscriptionId = subscriptionId. - Recalculates
nextPaymentDatefor the subscription. - Deletes the candidate record.
Candidate ID.
The subscription to link the transaction to. Must be one of the
subscriptionIds on the candidate.POST /api/subscriptions/candidates/:id/dismiss
Discard a candidate without linking anything. The transaction and all subscriptions remain untouched. The candidate record is deleted.Candidate ID.
Route ordering
The
/candidates and /candidates/:id/* routes must be registered before the /:id route in subscription.routes.ts. Express evaluates routes in declaration order; if /:id is first, the string "candidates" is captured as the subscription ID and the request 404s.