{"openapi":"3.1.0","info":{"title":"BankSync API","version":"1.0.0","description":"Connect bank accounts and sync financial data to Notion, Google Sheets, and Airtable. Authenticate with an API key (X-API-Key header) or a Firebase ID token (Bearer).","contact":{"name":"BankSync Support","url":"https://banksync.io"}},"servers":[{"url":"https://api.banksync.io","description":"Production"}],"components":{"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"X-API-Key","description":"API key — pass in the X-API-Key header. Obtain from Developer Settings in the BankSync app."},"bearerAuth":{"type":"http","scheme":"bearer","description":"Firebase ID token — pass as a Bearer token in the Authorization header."}},"schemas":{"TriggerSyncBody":{"type":"object","properties":{"startDate":{"type":"string","description":"Start date (YYYY-MM-DD) for date-range syncs (transactions, trades)."},"endDate":{"type":"string","description":"End date (YYYY-MM-DD) for date-range syncs (transactions, trades)."},"forceCancelActive":{"type":"boolean","description":"When true, cancel any currently-running sync on this feed before starting the new one. Use this for user-initiated retries when the previous sync is stuck. Defaults to false."},"resetCursors":{"type":"boolean","description":"When true, clear all per-bank cursors, tier-1/tier-2 dedup state, and the date-based watermark before fetching. Use for backfills or recovery when the incremental cursor has gone stale. Defaults to false (normal incremental sync)."},"skipDedup":{"type":"boolean","description":"When true, bypass the per-record dedup guard for this run. Use for backfills where upstream IDs are known-stable but downstream dedup has drifted. Defaults to false."}}},"ConditionGroup":{"type":"object","properties":{"logic":{"type":"string","enum":["and","or"]},"conditions":{"type":"array","minItems":1,"items":{"oneOf":[{"type":"object","properties":{"field":{"type":"string"},"operator":{"type":"string"},"value":{"oneOf":[{"type":"string"},{"type":"number"}]}},"required":["field","operator"]},{"$ref":"#/components/schemas/ConditionGroup"}]}}},"required":["logic","conditions"]},"RuleAction":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","enum":["set"],"description":"Static value write (default when `kind` is absent)"},"field":{"type":"string","description":"Target field to write"},"value":{"anyOf":[{"type":"string"},{"type":"number"}],"description":"Static value to set"}},"required":["field","value"]},{"type":"object","properties":{"kind":{"type":"string","enum":["template"]},"field":{"type":"string","description":"Target field to write"},"template":{"type":"string","minLength":1,"description":"Template with {{fieldName}} placeholders; missing fields render as ''"}},"required":["kind","field","template"]},{"type":"object","properties":{"kind":{"type":"string","enum":["regexExtract"]},"field":{"type":"string","description":"Target field to write"},"source":{"type":"string","minLength":1,"description":"Source field to extract from"},"pattern":{"type":"string","minLength":1,"description":"Safe-regex-guarded pattern; the captured group is written"},"group":{"type":"integer","minimum":0,"maximum":9,"description":"Capture group to write (default 1)"}},"required":["kind","field","source","pattern"]},{"type":"object","properties":{"kind":{"type":"string","enum":["case"]},"field":{"type":"string","description":"Target field to write"},"source":{"type":"string","minLength":1,"description":"Source field (defaults to `field` — in-place recase)"},"mode":{"type":"string","enum":["upper","lower","title"]}},"required":["kind","field","mode"]},{"type":"object","properties":{"kind":{"type":"string","enum":["math"]},"field":{"type":"string","description":"Target field to write"},"source":{"type":"string","minLength":1,"description":"Source field (defaults to `field`)"},"op":{"type":"string","enum":["abs","negate","round2"]}},"required":["kind","field","op"]}]}},"parameters":{}},"paths":{"/v1/banks":{"get":{"operationId":"listBanks","summary":"List bank connections","description":"List banks owned by the current workspace. Pass `?scope=family` to include banks from every portal under this workspace — useful for accountants who want a single view across all client portals. Family scope requires admin+ role and is only valid on a top-level workspace.","tags":["Banks"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","enum":["self","family"],"description":"Resource scope. `self` (default) returns this workspace only. `family` returns this workspace plus every live portal under it; each row gains a `portal: { id, name, icon } | null` badge and a `workspaceId` field. Admin+ only; top-level workspaces only."},"required":false,"description":"Resource scope. `self` (default) returns this workspace only. `family` returns this workspace plus every live portal under it; each row gains a `portal: { id, name, icon } | null` badge and a `workspaceId` field. Admin+ only; top-level workspaces only.","name":"scope","in":"query"}],"responses":{"200":{"description":"List of banks. When `scope=family`, each row additionally carries `workspaceId` and `portal`.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"source":{"type":"string","enum":["plaid","snaptrade","saltedge","fiskil"]},"type":{"type":"string"},"order":{"type":"number"},"icon":{"type":"string"},"connectionStatus":{"type":"object","properties":{"status":{"type":"string"},"errorCode":{"type":"string"},"errorMessage":{"type":"string"}},"required":["status"]},"institutionId":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"links":{"type":"object","additionalProperties":{"type":"string"}}},"required":["id","name","source","type","order","createdAt","updatedAt","links"]}}},"required":["success","data"]}}}},"400":{"description":"Invalid `scope` value, or `scope=family` was requested against a portal workspace","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"403":{"description":"Forbidden — `scope=family` requires admin+ role","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}}}}},"/v1/banks/{bid}":{"get":{"operationId":"getBank","summary":"Get a bank connection","tags":["Banks"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Bank ID"},"required":true,"description":"Bank ID","name":"bid","in":"path"}],"responses":{"200":{"description":"Bank detail","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"source":{"type":"string","enum":["plaid","snaptrade","saltedge","fiskil"]},"type":{"type":"string"},"order":{"type":"number"},"icon":{"type":"string"},"connectionStatus":{"type":"object","properties":{"status":{"type":"string"},"errorCode":{"type":"string"},"errorMessage":{"type":"string"}},"required":["status"]},"institutionId":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"links":{"type":"object","additionalProperties":{"type":"string"}}},"required":["id","name","source","type","order","createdAt","updatedAt","links"]}},"required":["success","data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}}}},"delete":{"operationId":"deleteBank","summary":"Remove a bank connection","tags":["Banks"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Bank ID"},"required":true,"description":"Bank ID","name":"bid","in":"path"}],"responses":{"200":{"description":"Bank removed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"deleted":{"type":"boolean","enum":[true]}},"required":["deleted"]}},"required":["success","data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"409":{"description":"Bank is still referenced by one or more sync feeds","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}}}}},"/v1/banks/connections/start":{"post":{"operationId":"startConnection","summary":"Start a new bank connection","description":"Initiates a provider-specific connection flow. Returns a `ConnectionStart` payload the client renders — a Plaid Link token, a portal popup URL, or an OAuth redirect URL depending on the provider.","tags":["Banks"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"providerInstanceId":{"type":"string","minLength":3,"pattern":"^[a-z]+:[a-z0-9_-]+$"},"email":{"type":"string","format":"email"},"mobile":{"type":"string"},"institutionId":{"type":"string"},"countryCodes":{"type":"array","items":{"type":"string"}},"redirectUri":{"type":"string"},"brokerageSlug":{"type":"string"},"saltedgeConsentScopes":{"type":"array","items":{"type":"string","enum":["holder_info","accounts","transactions"]}},"connectionType":{"type":"string","enum":["read","trade"]},"forceNewConnection":{"type":"boolean"}},"required":["providerInstanceId","email"]}}}},"responses":{"200":{"description":"Connection flow initiated","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"oneOf":[{"type":"object","properties":{"flow":{"type":"string","enum":["plaid_link"]},"linkToken":{"type":"string"},"expectedPayloadKind":{"type":"string","enum":["plaid_public_token"]}},"required":["flow","linkToken","expectedPayloadKind"]},{"type":"object","properties":{"flow":{"type":"string","enum":["fiskil_link"]},"authSessionId":{"type":"string"},"expectedPayloadKind":{"type":"string","enum":["provider_connection_id"]}},"required":["flow","authSessionId","expectedPayloadKind"]},{"type":"object","properties":{"flow":{"type":"string","enum":["portal_popup"]},"url":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"},"expectedPayloadKind":{"type":"string","enum":["provider_connection_id"]}},"required":["flow","url","expectedPayloadKind"]},{"type":"object","properties":{"flow":{"type":"string","enum":["oauth_redirect"]},"url":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"},"expectedPayloadKind":{"type":"string","enum":["provider_connection_id"]}},"required":["flow","url","expectedPayloadKind"]},{"type":"object","properties":{"flow":{"type":"string","enum":["existing_connection"]},"existingBanks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"requiresReauth":{"type":"boolean"}},"required":["id","name","requiresReauth"]}},"canCreateAdditional":{"type":"boolean"}},"required":["flow","existingBanks","canCreateAdditional"]}]}},"required":["success","data"]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"403":{"description":"Forbidden or plan limit reached","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"501":{"description":"Provider not available in this environment","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}}}}},"/v1/banks/connections/complete":{"post":{"operationId":"completeConnection","summary":"Complete an in-flight bank connection","description":"Exchanges the provider callback payload (public_token or connection_id) for a persisted bank connection. Returns the bank ID, whether it was newly created, and live account data.","tags":["Banks"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"providerInstanceId":{"type":"string","minLength":3,"pattern":"^[a-z]+:[a-z0-9_-]+$"},"payload":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","enum":["plaid_public_token"]},"publicToken":{"type":"string"},"institutionId":{"type":"string"}},"required":["kind","publicToken"]},{"type":"object","properties":{"kind":{"type":"string","enum":["provider_connection_id"]},"connectionId":{"type":"string","minLength":1}},"required":["kind","connectionId"]}]}},"required":["providerInstanceId","payload"]}}}},"responses":{"200":{"description":"Connection established","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"bankId":{"type":"string"},"created":{"type":"boolean"},"accounts":{"type":"array","items":{"type":"object","additionalProperties":{"nullable":true}}}},"required":["success","bankId","created","accounts"]}}}},"400":{"description":"Invalid payload","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"403":{"description":"Forbidden or plan limit reached","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"501":{"description":"Provider not available in this environment","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}}}}},"/v1/banks/connections/{bid}/reauth":{"post":{"operationId":"reauthConnection","summary":"Reauthorise an existing bank connection","description":"Produces a new connection start payload for an existing bank. Use when the connection has expired or been revoked.","tags":["Banks"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Bank ID"},"required":true,"description":"Bank ID","name":"bid","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"redirectUri":{"type":"string"}}}}}},"responses":{"200":{"description":"Reauth flow initiated","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"oneOf":[{"type":"object","properties":{"flow":{"type":"string","enum":["plaid_link"]},"linkToken":{"type":"string"},"expectedPayloadKind":{"type":"string","enum":["plaid_public_token"]}},"required":["flow","linkToken","expectedPayloadKind"]},{"type":"object","properties":{"flow":{"type":"string","enum":["fiskil_link"]},"authSessionId":{"type":"string"},"expectedPayloadKind":{"type":"string","enum":["provider_connection_id"]}},"required":["flow","authSessionId","expectedPayloadKind"]},{"type":"object","properties":{"flow":{"type":"string","enum":["portal_popup"]},"url":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"},"expectedPayloadKind":{"type":"string","enum":["provider_connection_id"]}},"required":["flow","url","expectedPayloadKind"]},{"type":"object","properties":{"flow":{"type":"string","enum":["oauth_redirect"]},"url":{"type":"string"},"expiresAt":{"type":"string","format":"date-time"},"expectedPayloadKind":{"type":"string","enum":["provider_connection_id"]}},"required":["flow","url","expectedPayloadKind"]},{"type":"object","properties":{"flow":{"type":"string","enum":["existing_connection"]},"existingBanks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"requiresReauth":{"type":"boolean"}},"required":["id","name","requiresReauth"]}},"canCreateAdditional":{"type":"boolean"}},"required":["flow","existingBanks","canCreateAdditional"]}]}},"required":["success","data"]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"404":{"description":"Bank not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}}}}},"/v1/banks/search":{"post":{"operationId":"searchInstitutions","summary":"Search for financial institutions","description":"Search the institution catalog for providers currently connectable in this workspace and environment. Results exclude providers whose feature gate is disabled as well as catalog-only seed data that cannot be connected in-app.","tags":["Banks"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string","minLength":1,"maxLength":100},"countryCodes":{"type":"array","items":{"type":"string","minLength":2,"maxLength":2},"maxItems":20},"providerInstanceId":{"type":"string","maxLength":64}},"required":["query"]}}}},"responses":{"200":{"description":"Search results","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"institutions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"logo":{"type":"string"},"countryCodes":{"type":"array","items":{"type":"string"}},"provider":{"type":"string"},"providerInstanceId":{"type":"string"},"region":{"type":"string"},"products":{"type":"array","items":{"type":"string"}},"url":{"type":"string"},"primaryColor":{"type":"string"},"routingNumbers":{"type":"array","items":{"type":"string"}},"tags":{"type":"array","items":{"type":"string"}}},"required":["id","name","countryCodes","provider"]}},"providers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["ok","rate_limited","failed","skipped_unsupported_country","skipped_unsupported_capability","skipped_excluded"]},"contributed":{"type":"integer","minimum":0},"error":{"type":"string"},"providerErrorCode":{"type":"string"},"retryAfter":{"type":"string","format":"date-time"}},"required":["id","status","contributed"]}}},"required":["institutions","providers"]}},"required":["success","data"]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}}}}},"/v1/banks/{bid}/accounts":{"get":{"operationId":"listAccounts","summary":"List accounts for a bank","tags":["Accounts"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Bank ID"},"required":true,"description":"Bank ID","name":"bid","in":"path"}],"responses":{"200":{"description":"List of accounts","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"bankId":{"type":"string"},"accountNumber":{"type":"string"},"accountName":{"type":"string"},"accountType":{"type":"string"},"balance":{"type":"number"},"availableBalance":{"type":"number"},"currency":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"links":{"type":"object","additionalProperties":{"type":"string"}}},"required":["id","bankId","accountNumber","accountType","balance","availableBalance","currency","createdAt","updatedAt","links"]}}},"required":["success","data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}}}}},"/v1/banks/{bid}/accounts/{aid}":{"get":{"operationId":"getAccount","summary":"Get an account","tags":["Accounts"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Bank ID"},"required":true,"description":"Bank ID","name":"bid","in":"path"},{"schema":{"type":"string","description":"Account ID"},"required":true,"description":"Account ID","name":"aid","in":"path"}],"responses":{"200":{"description":"Account detail","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"bankId":{"type":"string"},"accountNumber":{"type":"string"},"accountName":{"type":"string"},"accountType":{"type":"string"},"balance":{"type":"number"},"availableBalance":{"type":"number"},"currency":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"links":{"type":"object","additionalProperties":{"type":"string"}}},"required":["id","bankId","accountNumber","accountType","balance","availableBalance","currency","createdAt","updatedAt","links"]}},"required":["success","data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}}}}},"/v1/banks/{bid}/accounts/{aid}/transactions":{"get":{"operationId":"listTransactions","summary":"List transactions for an account","tags":["Transactions"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Bank ID"},"required":true,"description":"Bank ID","name":"bid","in":"path"},{"schema":{"type":"string","description":"Account ID"},"required":true,"description":"Account ID","name":"aid","in":"path"},{"schema":{"type":"string","description":"Cursor for incremental delta sync (providers that support delta-cursor mode)"},"required":false,"description":"Cursor for incremental delta sync (providers that support delta-cursor mode)","name":"cursor","in":"query"},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Start date (YYYY-MM-DD)"},"required":false,"description":"Start date (YYYY-MM-DD)","name":"from","in":"query"},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"End date (YYYY-MM-DD)"},"required":false,"description":"End date (YYYY-MM-DD)","name":"to","in":"query"}],"responses":{"200":{"description":"List of transactions","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"date":{"type":"string"},"authorizedDate":{"type":"string"},"description":{"type":"string"},"originalDescription":{"type":"string"},"amount":{"type":"number"},"creditAmount":{"type":"number"},"debitAmount":{"type":"number"},"currency":{"type":"string"},"category":{"type":"string"},"type":{"type":"string"},"reference":{"type":"string"},"pending":{"type":"boolean"},"pendingTransactionId":{"type":"string","nullable":true},"accountId":{"type":"string"},"accountName":{"type":"string"},"accountNumber":{"type":"string"},"bankId":{"type":"string"},"bank":{"type":"string"}},"required":["id","date","description","amount","creditAmount","debitAmount","currency","category","type","pending","accountId","bankId"]}},"meta":{"type":"object","properties":{"count":{"type":"number"},"cursor":{"type":"string","nullable":true},"hasMore":{"type":"boolean"},"from":{"type":"string"},"to":{"type":"string"}},"required":["count"]},"modified":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"date":{"type":"string"},"authorizedDate":{"type":"string"},"description":{"type":"string"},"originalDescription":{"type":"string"},"amount":{"type":"number"},"creditAmount":{"type":"number"},"debitAmount":{"type":"number"},"currency":{"type":"string"},"category":{"type":"string"},"type":{"type":"string"},"reference":{"type":"string"},"pending":{"type":"boolean"},"pendingTransactionId":{"type":"string","nullable":true},"accountId":{"type":"string"},"accountName":{"type":"string"},"accountNumber":{"type":"string"},"bankId":{"type":"string"},"bank":{"type":"string"}},"required":["id","date","description","amount","creditAmount","debitAmount","currency","category","type","pending","accountId","bankId"]}},"removed":{"type":"array","items":{"type":"string"}},"links":{"type":"object","properties":{"self":{"type":"string"},"account":{"type":"string"},"next":{"type":"string"}},"required":["self","account"]}},"required":["success","data","meta"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}}}}},"/v1/banks/{bid}/accounts/{aid}/balances":{"get":{"operationId":"getBalance","summary":"Get live balance for an account","tags":["Balances"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Bank ID"},"required":true,"description":"Bank ID","name":"bid","in":"path"},{"schema":{"type":"string","description":"Account ID"},"required":true,"description":"Account ID","name":"aid","in":"path"}],"responses":{"200":{"description":"Live balance for the account","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"date":{"type":"string"},"bank":{"type":"string"},"account":{"type":"string"},"accountName":{"type":"string"},"accountNumber":{"type":"string"},"accountType":{"type":"string"},"accountId":{"type":"string"},"bankId":{"type":"string"},"amount":{"type":"number"},"availableBalance":{"type":"number","nullable":true},"pendingBalance":{"type":"number"},"currency":{"type":"string"}},"required":["date","account","accountName","accountNumber","accountType","accountId","bankId","amount","availableBalance","currency"]}},"required":["success","data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}}}}},"/v1/banks/{bid}/accounts/{aid}/trades":{"get":{"operationId":"listTrades","summary":"List investment trades for an account","tags":["Trades"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Bank ID"},"required":true,"description":"Bank ID","name":"bid","in":"path"},{"schema":{"type":"string","description":"Account ID"},"required":true,"description":"Account ID","name":"aid","in":"path"},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Start date (YYYY-MM-DD, default last 90 days)"},"required":false,"description":"Start date (YYYY-MM-DD, default last 90 days)","name":"from","in":"query"},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"End date (YYYY-MM-DD, default today)"},"required":false,"description":"End date (YYYY-MM-DD, default today)","name":"to","in":"query"}],"responses":{"200":{"description":"List of trades","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"accountId":{"type":"string"},"bankId":{"type":"string"},"date":{"type":"string"},"type":{"type":"string","description":"buy, sell, dividend, split, etc."},"securityName":{"type":"string"},"securityId":{"type":"string"},"ticker":{"type":"string"},"quantity":{"type":"number"},"price":{"type":"number"},"amount":{"type":"number"},"fees":{"type":"number"},"currency":{"type":"string"}},"required":["id","accountId","date","type","amount","currency"]}}},"required":["success","data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}}}}},"/v1/banks/{bid}/accounts/{aid}/holdings":{"get":{"operationId":"listHoldings","summary":"List current investment holdings for an account","tags":["Holdings"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Bank ID"},"required":true,"description":"Bank ID","name":"bid","in":"path"},{"schema":{"type":"string","description":"Account ID"},"required":true,"description":"Account ID","name":"aid","in":"path"}],"responses":{"200":{"description":"Current investment positions","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"type":"object","properties":{"accountId":{"type":"string"},"bankId":{"type":"string"},"securityName":{"type":"string"},"securityId":{"type":"string"},"ticker":{"type":"string"},"quantity":{"type":"number"},"costBasis":{"type":"number","nullable":true},"currentValue":{"type":"number"},"currentPrice":{"type":"number"},"currency":{"type":"string"},"isCashEquivalent":{"type":"boolean"}},"required":["accountId","quantity","currency"]}}},"required":["success","data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}}}}},"/v1/banks/{bid}/accounts/{aid}/orders":{"get":{"operationId":"listOrders","summary":"List open and pending orders for an account","description":"Returns orders in PENDING/PARTIALLY_FILLED/ACCEPTED/QUEUED/TRIGGERED status. Executed orders surface through the /trades endpoint instead. Returns an empty list for providers that do not expose orders (Plaid, SaltEdge).","tags":["Orders"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Bank ID"},"required":true,"description":"Bank ID","name":"bid","in":"path"},{"schema":{"type":"string","description":"Account ID"},"required":true,"description":"Account ID","name":"aid","in":"path"}],"responses":{"200":{"description":"Open/pending orders","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"brokerageOrderId":{"type":"string"},"date":{"type":"string"},"status":{"type":"string"},"action":{"type":"string"},"orderType":{"type":"string"},"timeInForce":{"type":"string"},"totalQuantity":{"type":"number"},"filledQuantity":{"type":"number"},"openQuantity":{"type":"number"},"canceledQuantity":{"type":"number"},"limitPrice":{"type":"number","nullable":true},"stopPrice":{"type":"number","nullable":true},"trailingStop":{"type":"number","nullable":true},"executionPrice":{"type":"number","nullable":true},"currency":{"type":"string"},"security":{"type":"string"},"ticker":{"type":"string","nullable":true},"bank":{"type":"string"},"accountId":{"type":"string"},"bankId":{"type":"string"},"executedAt":{"type":"string","nullable":true},"expiresAt":{"type":"string","nullable":true}},"required":["id","brokerageOrderId","date","status","action","orderType","timeInForce","totalQuantity","filledQuantity","openQuantity","canceledQuantity","currency","security","bank"]}}},"required":["success","data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}}}}},"/v1/banks/{bid}/accounts/{aid}/loan":{"get":{"operationId":"getLoan","summary":"Get loan or liability details for an account","tags":["Loans"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Bank ID"},"required":true,"description":"Bank ID","name":"bid","in":"path"},{"schema":{"type":"string","description":"Account ID"},"required":true,"description":"Account ID","name":"aid","in":"path"}],"responses":{"200":{"description":"Loan / liability details for the account","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"accountId":{"type":"string"},"loanType":{"type":"string"},"principalBalance":{"type":"number"},"originationPrincipalAmount":{"type":"number"},"interestRatePercentage":{"type":"number"},"nextPaymentAmount":{"type":"number"},"nextPaymentDueDate":{"type":"string"},"maturityDate":{"type":"string"},"isOverdue":{"type":"boolean"},"currency":{"type":"string"}},"required":["accountId"]}},"required":["success","data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"404":{"description":"No loan data found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}}}}},"/v1/feeds":{"get":{"operationId":"listFeeds","summary":"List feeds","description":"List feeds owned by the current workspace. Pass `?scope=family` to include feeds from every portal under this workspace. Family scope requires admin+ role and is only valid on a top-level workspace.","tags":["Feeds"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","enum":["self","family"],"description":"Resource scope. `self` (default) returns this workspace only. `family` includes every portal under it; each row gains `workspaceId` + `portal: { id, name, icon } | null`. Admin+ only, top-level workspaces only."},"required":false,"description":"Resource scope. `self` (default) returns this workspace only. `family` includes every portal under it; each row gains `workspaceId` + `portal: { id, name, icon } | null`. Admin+ only, top-level workspaces only.","name":"scope","in":"query"}],"responses":{"200":{"description":"List of feeds. When `scope=family`, each row additionally carries `workspaceId` and `portal`.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"workspaceId":{"type":"string"},"source":{"type":"string","enum":["sync","extractor","upload"]},"dataType":{"type":"string","enum":["transactions","balances","trades","holdings","orders","loans","receipts","invoices","documents"]},"sourceConfig":{"type":"object","additionalProperties":{"nullable":true}},"destinationConfig":{"type":"object","additionalProperties":{"nullable":true}},"fieldMappings":{"type":"array","items":{"type":"object","properties":{"sourceField":{"type":"string"},"destinationField":{"type":"string"}},"required":["sourceField","destinationField"]}},"dataTypeOptions":{"type":"object","additionalProperties":{"nullable":true}},"extractionConfig":{"type":"object","properties":{"extractionFields":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"},"description":{"type":"string"},"examples":{"type":"array","items":{"type":"string"}},"isItemField":{"type":"boolean"}},"required":["name","type"]}},"itemizePerRow":{"type":"boolean"},"extractionInstructions":{"type":"string"}},"required":["extractionFields","itemizePerRow"]},"schedule":{"type":"object","properties":{"enabled":{"type":"boolean"},"frequency":{"type":"string","enum":["hourly","daily","weekly","monthly"]},"timeOfDay":{"type":"string","pattern":"^\\d{2}:\\d{2}$","description":"\"HH:MM\" UTC format, e.g. \"09:30\""},"dayOfWeek":{"type":"number","minimum":0,"maximum":6},"dayOfMonth":{"type":"number","minimum":1,"maximum":31}},"required":["enabled","frequency","timeOfDay"]},"state":{"type":"object","additionalProperties":{"nullable":true}},"order":{"type":"number"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","name","source","dataType","state","order","createdAt","updatedAt"]}}},"required":["success","data"]}}}},"400":{"description":"Invalid `scope` value, or `scope=family` was requested against a portal workspace","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"403":{"description":"Forbidden — `scope=family` requires admin+ role","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}}}},"post":{"operationId":"createFeed","summary":"Create a feed","tags":["Feeds"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"Human-readable feed name, e.g. \"ANZ Transactions → Notion\""},"source":{"type":"string","enum":["sync","extractor","upload"],"description":"\"sync\" = bank API; \"extractor\" = email/PDF AI extraction; \"upload\" = file upload"},"dataType":{"type":"string","enum":["transactions","balances","trades","holdings","orders","loans","receipts","invoices","documents"],"description":"Type of financial data this feed produces"},"icon":{"type":"string","description":"Optional emoji or icon identifier"},"order":{"type":"integer","description":"Display sort order"},"sourceConfig":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["sync"]},"accounts":{"type":"array","items":{"type":"object","properties":{"bankId":{"type":"string","description":"Bank ID — get from list_banks"},"accountId":{"type":"string","description":"Account ID — get from list_accounts"}},"required":["bankId","accountId"]},"minItems":1,"description":"One or more bank accounts to sync from"}},"required":["type","accounts"],"description":"Bank API sync source — pulls structured financial data from Plaid, SaltEdge, or SnapTrade"},{"type":"object","properties":{"type":{"type":"string","enum":["extractor"]},"inboxAddress":{"type":"string","format":"email","description":"Auto-generated forwarding email address (set by system on creation)"},"whitelistEnabled":{"type":"boolean","default":false,"description":"When true, only emails from addresses in the whitelist are processed"},"whitelist":{"type":"array","items":{"type":"string","format":"email"},"description":"Allowed sender email addresses (only used when whitelistEnabled is true)"}},"required":["type"],"description":"Email extraction source — processes forwarded emails using AI"},{"type":"object","properties":{"type":{"type":"string","enum":["upload"]}},"required":["type"],"description":"File upload source — processes uploaded PDFs/images using AI"}],"description":"How to connect to the data source. Required before triggering a sync."},"destinationConfig":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["notion"]},"integrationId":{"type":"string","description":"Notion integration ID — get from list_integrations"},"databaseId":{"type":"string","description":"Notion database ID to write records into"}},"required":["type","integrationId","databaseId"],"description":"Write to a Notion database"},{"type":"object","properties":{"type":{"type":"string","enum":["airtable"]},"integrationId":{"type":"string","description":"Airtable integration ID — get from list_integrations"},"baseId":{"type":"string","description":"Airtable base ID"},"tableId":{"type":"string","description":"Airtable table ID to write records into"}},"required":["type","integrationId","baseId","tableId"],"description":"Write to an Airtable table"},{"type":"object","properties":{"type":{"type":"string","enum":["google_sheets"]},"integrationId":{"type":"string","description":"Google Sheets integration ID — get from list_integrations"},"spreadsheetId":{"type":"string","description":"Google Sheets spreadsheet ID"},"sheetName":{"type":"string","description":"Name of the sheet tab to write into"},"direction":{"type":"string","enum":["row","column"],"description":"\"row\" = each record is a row (default); \"column\" = each record is a column"},"headerRowOrColumn":{"type":"integer","minimum":0,"exclusiveMinimum":true,"description":"Row number (for row direction) or column number (for column direction) that contains headers"},"pushLocation":{"type":"string","enum":["beginning","end"],"description":"Where to insert new records: \"beginning\" prepends, \"end\" appends"},"attachmentFolderId":{"type":"string","description":"Optional Google Drive folder ID for storing file attachments"}},"required":["type","integrationId","spreadsheetId","sheetName","direction","headerRowOrColumn","pushLocation"],"description":"Write to a Google Sheets spreadsheet"},{"type":"object","properties":{"type":{"type":"string","enum":["excel"]},"integrationId":{"type":"string","description":"Excel integration ID — get from list_integrations"},"driveId":{"type":"string","description":"OneDrive drive ID (get from getWorkspaces)"},"workbookId":{"type":"string","description":"Excel workbook item ID (get from searchDatabases)"},"worksheetName":{"type":"string","description":"Name of the worksheet tab to write into"},"direction":{"type":"string","enum":["row","column"],"description":"\"row\" = each record is a row (default); \"column\" = each record is a column"},"headerRowOrColumn":{"type":"integer","minimum":0,"exclusiveMinimum":true,"description":"Row number (for row direction) or column number (for column direction) that contains headers"},"pushLocation":{"type":"string","enum":["beginning","end"],"description":"Where to insert new records: \"beginning\" prepends, \"end\" appends"},"attachmentFolderId":{"type":"string","description":"Optional OneDrive folder ID for storing file attachments"},"attachmentDriveId":{"type":"string","description":"Drive ID for the attachment folder (defaults to workbook driveId)"},"preferTablesApi":{"type":"boolean","description":"Prefer Excel Tables API when target is inside an Excel Table (org accounts only)"}},"required":["type","integrationId","driveId","workbookId","worksheetName","direction","headerRowOrColumn","pushLocation"],"description":"Write to a Microsoft Excel workbook on OneDrive"},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"integrationId":{"type":"string","description":"Webhook endpoint integration ID — get from list_integrations"}},"required":["type","integrationId"],"description":"POST signed JSON to a customer HTTPS endpoint. No field mapping: the payload is the standard versioned envelope (see the webhooks developer docs). Supports transactions, balances, holdings, trades, orders, and loans."}],"description":"Where to write the data. Required before triggering a sync."},"fieldMappings":{"type":"array","items":{"type":"object","properties":{"sourceField":{"type":"string","description":"Source field key — get valid keys from get_data_type_schema"},"destinationField":{"type":"string","description":"Destination property ID (Notion/Airtable) or column name (Sheets)"}},"required":["sourceField","destinationField"]},"description":"Maps source fields to destination columns/properties"},"dataTypeOptions":{"oneOf":[{"type":"object","properties":{"dataType":{"type":"string","enum":["transactions"]},"pendingMode":{"type":"string","enum":["sync_all","filter_pending","track_and_update"],"description":"\"sync_all\" — include pending transactions as-is; \"filter_pending\" — exclude pending transactions; \"track_and_update\" — sync pending and update records when they settle (recommended)"}},"required":["dataType","pendingMode"],"description":"Processing options for transaction feeds"},{"type":"object","properties":{"dataType":{"type":"string","enum":["balances"]},"mode":{"type":"string","enum":["append","overwrite"],"description":"\"append\" — add a new row for each sync (historical log); \"overwrite\" — replace the existing record (live snapshot)"}},"required":["dataType","mode"],"description":"Processing options for balance feeds"},{"type":"object","properties":{"dataType":{"type":"string","enum":["trades"]}},"required":["dataType"],"description":"Processing options for trade feeds"},{"type":"object","properties":{"dataType":{"type":"string","enum":["holdings"]}},"required":["dataType"],"description":"Processing options for holdings feeds"},{"type":"object","properties":{"dataType":{"type":"string","enum":["orders"]}},"required":["dataType"],"description":"Processing options for order feeds"},{"type":"object","properties":{"dataType":{"type":"string","enum":["loans"]}},"required":["dataType"],"description":"Processing options for loan feeds"}],"description":"Data-type-specific processing options (sync feeds only)"},"extractionConfig":{"type":"object","properties":{"extractionFields":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","description":"Unique field identifier (snake_case)"},"name":{"type":"string","description":"Human-readable field name"},"type":{"type":"string","enum":["string","number","date","currency","boolean","category","id"],"description":"Field data type"},"description":{"type":"string","description":"Description to guide AI extraction"},"examples":{"type":"array","items":{"type":"string"},"description":"Example values to improve extraction accuracy"},"isItemField":{"type":"boolean","description":"True if this field is part of a line-item list (e.g. individual receipt items)"}},"required":["key","name","type"]},"minItems":1,"description":"Fields the AI will extract from each document"},"itemizePerRow":{"type":"boolean","description":"True = one destination row per extracted item; False = one row per document"},"extractionInstructions":{"type":"string","description":"Custom instructions for the AI extractor (e.g. \"always use AUD for currency\")"}},"required":["extractionFields","itemizePerRow"],"description":"AI extraction field definitions (extractor/upload feeds only)"},"schedule":{"type":"object","properties":{"enabled":{"type":"boolean"},"frequency":{"type":"string","enum":["hourly","daily","weekly","monthly"]},"timeOfDay":{"type":"string","pattern":"^\\d{2}:\\d{2}$"},"dayOfWeek":{"type":"integer","minimum":0,"maximum":6,"description":"Day of week for weekly schedules (0 = Sunday, 6 = Saturday)"},"dayOfMonth":{"type":"integer","minimum":1,"maximum":31,"description":"Day of month for monthly schedules"}},"required":["enabled","frequency","timeOfDay"],"description":"Automated sync schedule"}},"required":["name","source","dataType"]}}}},"responses":{"201":{"description":"Feed created — returns the full feed document","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"workspaceId":{"type":"string"},"source":{"type":"string","enum":["sync","extractor","upload"]},"dataType":{"type":"string","enum":["transactions","balances","trades","holdings","orders","loans","receipts","invoices","documents"]},"sourceConfig":{"type":"object","additionalProperties":{"nullable":true}},"destinationConfig":{"type":"object","additionalProperties":{"nullable":true}},"fieldMappings":{"type":"array","items":{"type":"object","properties":{"sourceField":{"type":"string"},"destinationField":{"type":"string"}},"required":["sourceField","destinationField"]}},"dataTypeOptions":{"type":"object","additionalProperties":{"nullable":true}},"extractionConfig":{"type":"object","properties":{"extractionFields":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"},"description":{"type":"string"},"examples":{"type":"array","items":{"type":"string"}},"isItemField":{"type":"boolean"}},"required":["name","type"]}},"itemizePerRow":{"type":"boolean"},"extractionInstructions":{"type":"string"}},"required":["extractionFields","itemizePerRow"]},"schedule":{"type":"object","properties":{"enabled":{"type":"boolean"},"frequency":{"type":"string","enum":["hourly","daily","weekly","monthly"]},"timeOfDay":{"type":"string","pattern":"^\\d{2}:\\d{2}$","description":"\"HH:MM\" UTC format, e.g. \"09:30\""},"dayOfWeek":{"type":"number","minimum":0,"maximum":6},"dayOfMonth":{"type":"number","minimum":1,"maximum":31}},"required":["enabled","frequency","timeOfDay"]},"state":{"type":"object","additionalProperties":{"nullable":true}},"order":{"type":"number"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","name","source","dataType","state","order","createdAt","updatedAt"]}},"required":["success","data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"422":{"description":"Validation failed — sourceConfig, fieldMappings, or source×dataType combination is invalid","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"errors":{"type":"array","items":{"type":"string"},"description":"Hard errors that blocked the request"},"warnings":{"type":"array","items":{"type":"string"},"description":"Soft warnings — resolve before triggering a sync"}},"required":["success","error"]}}}}}}},"/v1/feeds/{fid}":{"get":{"operationId":"getFeed","summary":"Get a feed","tags":["Feeds"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Feed ID"},"required":true,"description":"Feed ID","name":"fid","in":"path"}],"responses":{"200":{"description":"Feed detail","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"workspaceId":{"type":"string"},"source":{"type":"string","enum":["sync","extractor","upload"]},"dataType":{"type":"string","enum":["transactions","balances","trades","holdings","orders","loans","receipts","invoices","documents"]},"sourceConfig":{"type":"object","additionalProperties":{"nullable":true}},"destinationConfig":{"type":"object","additionalProperties":{"nullable":true}},"fieldMappings":{"type":"array","items":{"type":"object","properties":{"sourceField":{"type":"string"},"destinationField":{"type":"string"}},"required":["sourceField","destinationField"]}},"dataTypeOptions":{"type":"object","additionalProperties":{"nullable":true}},"extractionConfig":{"type":"object","properties":{"extractionFields":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"},"description":{"type":"string"},"examples":{"type":"array","items":{"type":"string"}},"isItemField":{"type":"boolean"}},"required":["name","type"]}},"itemizePerRow":{"type":"boolean"},"extractionInstructions":{"type":"string"}},"required":["extractionFields","itemizePerRow"]},"schedule":{"type":"object","properties":{"enabled":{"type":"boolean"},"frequency":{"type":"string","enum":["hourly","daily","weekly","monthly"]},"timeOfDay":{"type":"string","pattern":"^\\d{2}:\\d{2}$","description":"\"HH:MM\" UTC format, e.g. \"09:30\""},"dayOfWeek":{"type":"number","minimum":0,"maximum":6},"dayOfMonth":{"type":"number","minimum":1,"maximum":31}},"required":["enabled","frequency","timeOfDay"]},"state":{"type":"object","additionalProperties":{"nullable":true}},"order":{"type":"number"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","name","source","dataType","state","order","createdAt","updatedAt"]}},"required":["success","data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}}}},"put":{"operationId":"updateFeed","summary":"Update a feed","tags":["Feeds"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Feed ID"},"required":true,"description":"Feed ID","name":"fid","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"Human-readable feed name, e.g. \"ANZ Transactions → Notion\""},"icon":{"type":"string","description":"Optional emoji or icon identifier"},"order":{"type":"integer","description":"Display sort order"},"sourceConfig":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["sync"]},"accounts":{"type":"array","items":{"type":"object","properties":{"bankId":{"type":"string","description":"Bank ID — get from list_banks"},"accountId":{"type":"string","description":"Account ID — get from list_accounts"}},"required":["bankId","accountId"]},"minItems":1,"description":"One or more bank accounts to sync from"}},"required":["type","accounts"],"description":"Bank API sync source — pulls structured financial data from Plaid, SaltEdge, or SnapTrade"},{"type":"object","properties":{"type":{"type":"string","enum":["extractor"]},"inboxAddress":{"type":"string","format":"email","description":"Auto-generated forwarding email address (set by system on creation)"},"whitelistEnabled":{"type":"boolean","default":false,"description":"When true, only emails from addresses in the whitelist are processed"},"whitelist":{"type":"array","items":{"type":"string","format":"email"},"description":"Allowed sender email addresses (only used when whitelistEnabled is true)"}},"required":["type"],"description":"Email extraction source — processes forwarded emails using AI"},{"type":"object","properties":{"type":{"type":"string","enum":["upload"]}},"required":["type"],"description":"File upload source — processes uploaded PDFs/images using AI"}],"description":"How to connect to the data source. Required before triggering a sync."},"destinationConfig":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["notion"]},"integrationId":{"type":"string","description":"Notion integration ID — get from list_integrations"},"databaseId":{"type":"string","description":"Notion database ID to write records into"}},"required":["type","integrationId","databaseId"],"description":"Write to a Notion database"},{"type":"object","properties":{"type":{"type":"string","enum":["airtable"]},"integrationId":{"type":"string","description":"Airtable integration ID — get from list_integrations"},"baseId":{"type":"string","description":"Airtable base ID"},"tableId":{"type":"string","description":"Airtable table ID to write records into"}},"required":["type","integrationId","baseId","tableId"],"description":"Write to an Airtable table"},{"type":"object","properties":{"type":{"type":"string","enum":["google_sheets"]},"integrationId":{"type":"string","description":"Google Sheets integration ID — get from list_integrations"},"spreadsheetId":{"type":"string","description":"Google Sheets spreadsheet ID"},"sheetName":{"type":"string","description":"Name of the sheet tab to write into"},"direction":{"type":"string","enum":["row","column"],"description":"\"row\" = each record is a row (default); \"column\" = each record is a column"},"headerRowOrColumn":{"type":"integer","minimum":0,"exclusiveMinimum":true,"description":"Row number (for row direction) or column number (for column direction) that contains headers"},"pushLocation":{"type":"string","enum":["beginning","end"],"description":"Where to insert new records: \"beginning\" prepends, \"end\" appends"},"attachmentFolderId":{"type":"string","description":"Optional Google Drive folder ID for storing file attachments"}},"required":["type","integrationId","spreadsheetId","sheetName","direction","headerRowOrColumn","pushLocation"],"description":"Write to a Google Sheets spreadsheet"},{"type":"object","properties":{"type":{"type":"string","enum":["excel"]},"integrationId":{"type":"string","description":"Excel integration ID — get from list_integrations"},"driveId":{"type":"string","description":"OneDrive drive ID (get from getWorkspaces)"},"workbookId":{"type":"string","description":"Excel workbook item ID (get from searchDatabases)"},"worksheetName":{"type":"string","description":"Name of the worksheet tab to write into"},"direction":{"type":"string","enum":["row","column"],"description":"\"row\" = each record is a row (default); \"column\" = each record is a column"},"headerRowOrColumn":{"type":"integer","minimum":0,"exclusiveMinimum":true,"description":"Row number (for row direction) or column number (for column direction) that contains headers"},"pushLocation":{"type":"string","enum":["beginning","end"],"description":"Where to insert new records: \"beginning\" prepends, \"end\" appends"},"attachmentFolderId":{"type":"string","description":"Optional OneDrive folder ID for storing file attachments"},"attachmentDriveId":{"type":"string","description":"Drive ID for the attachment folder (defaults to workbook driveId)"},"preferTablesApi":{"type":"boolean","description":"Prefer Excel Tables API when target is inside an Excel Table (org accounts only)"}},"required":["type","integrationId","driveId","workbookId","worksheetName","direction","headerRowOrColumn","pushLocation"],"description":"Write to a Microsoft Excel workbook on OneDrive"},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"integrationId":{"type":"string","description":"Webhook endpoint integration ID — get from list_integrations"}},"required":["type","integrationId"],"description":"POST signed JSON to a customer HTTPS endpoint. No field mapping: the payload is the standard versioned envelope (see the webhooks developer docs). Supports transactions, balances, holdings, trades, orders, and loans."}],"description":"Where to write the data. Required before triggering a sync."},"fieldMappings":{"type":"array","items":{"type":"object","properties":{"sourceField":{"type":"string","description":"Source field key — get valid keys from get_data_type_schema"},"destinationField":{"type":"string","description":"Destination property ID (Notion/Airtable) or column name (Sheets)"}},"required":["sourceField","destinationField"]},"description":"Maps source fields to destination columns/properties"},"dataTypeOptions":{"oneOf":[{"type":"object","properties":{"dataType":{"type":"string","enum":["transactions"]},"pendingMode":{"type":"string","enum":["sync_all","filter_pending","track_and_update"],"description":"\"sync_all\" — include pending transactions as-is; \"filter_pending\" — exclude pending transactions; \"track_and_update\" — sync pending and update records when they settle (recommended)"}},"required":["dataType","pendingMode"],"description":"Processing options for transaction feeds"},{"type":"object","properties":{"dataType":{"type":"string","enum":["balances"]},"mode":{"type":"string","enum":["append","overwrite"],"description":"\"append\" — add a new row for each sync (historical log); \"overwrite\" — replace the existing record (live snapshot)"}},"required":["dataType","mode"],"description":"Processing options for balance feeds"},{"type":"object","properties":{"dataType":{"type":"string","enum":["trades"]}},"required":["dataType"],"description":"Processing options for trade feeds"},{"type":"object","properties":{"dataType":{"type":"string","enum":["holdings"]}},"required":["dataType"],"description":"Processing options for holdings feeds"},{"type":"object","properties":{"dataType":{"type":"string","enum":["orders"]}},"required":["dataType"],"description":"Processing options for order feeds"},{"type":"object","properties":{"dataType":{"type":"string","enum":["loans"]}},"required":["dataType"],"description":"Processing options for loan feeds"}],"description":"Data-type-specific processing options (sync feeds only)"},"extractionConfig":{"type":"object","properties":{"extractionFields":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","description":"Unique field identifier (snake_case)"},"name":{"type":"string","description":"Human-readable field name"},"type":{"type":"string","enum":["string","number","date","currency","boolean","category","id"],"description":"Field data type"},"description":{"type":"string","description":"Description to guide AI extraction"},"examples":{"type":"array","items":{"type":"string"},"description":"Example values to improve extraction accuracy"},"isItemField":{"type":"boolean","description":"True if this field is part of a line-item list (e.g. individual receipt items)"}},"required":["key","name","type"]},"minItems":1,"description":"Fields the AI will extract from each document"},"itemizePerRow":{"type":"boolean","description":"True = one destination row per extracted item; False = one row per document"},"extractionInstructions":{"type":"string","description":"Custom instructions for the AI extractor (e.g. \"always use AUD for currency\")"}},"required":["extractionFields","itemizePerRow"],"description":"AI extraction field definitions (extractor/upload feeds only)"},"schedule":{"type":"object","properties":{"enabled":{"type":"boolean"},"frequency":{"type":"string","enum":["hourly","daily","weekly","monthly"]},"timeOfDay":{"type":"string","pattern":"^\\d{2}:\\d{2}$"},"dayOfWeek":{"type":"integer","minimum":0,"maximum":6,"description":"Day of week for weekly schedules (0 = Sunday, 6 = Saturday)"},"dayOfMonth":{"type":"integer","minimum":1,"maximum":31,"description":"Day of month for monthly schedules"}},"required":["enabled","frequency","timeOfDay"],"description":"Automated sync schedule"}}}}}},"responses":{"200":{"description":"Feed updated","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"icon":{"type":"string"},"workspaceId":{"type":"string"},"source":{"type":"string","enum":["sync","extractor","upload"]},"dataType":{"type":"string","enum":["transactions","balances","trades","holdings","orders","loans","receipts","invoices","documents"]},"sourceConfig":{"type":"object","additionalProperties":{"nullable":true}},"destinationConfig":{"type":"object","additionalProperties":{"nullable":true}},"fieldMappings":{"type":"array","items":{"type":"object","properties":{"sourceField":{"type":"string"},"destinationField":{"type":"string"}},"required":["sourceField","destinationField"]}},"dataTypeOptions":{"type":"object","additionalProperties":{"nullable":true}},"extractionConfig":{"type":"object","properties":{"extractionFields":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"},"description":{"type":"string"},"examples":{"type":"array","items":{"type":"string"}},"isItemField":{"type":"boolean"}},"required":["name","type"]}},"itemizePerRow":{"type":"boolean"},"extractionInstructions":{"type":"string"}},"required":["extractionFields","itemizePerRow"]},"schedule":{"type":"object","properties":{"enabled":{"type":"boolean"},"frequency":{"type":"string","enum":["hourly","daily","weekly","monthly"]},"timeOfDay":{"type":"string","pattern":"^\\d{2}:\\d{2}$","description":"\"HH:MM\" UTC format, e.g. \"09:30\""},"dayOfWeek":{"type":"number","minimum":0,"maximum":6},"dayOfMonth":{"type":"number","minimum":1,"maximum":31}},"required":["enabled","frequency","timeOfDay"]},"state":{"type":"object","additionalProperties":{"nullable":true}},"order":{"type":"number"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","name","source","dataType","state","order","createdAt","updatedAt"]}},"required":["success","data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"422":{"description":"Validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"errors":{"type":"array","items":{"type":"string"},"description":"Hard errors that blocked the request"},"warnings":{"type":"array","items":{"type":"string"},"description":"Soft warnings — resolve before triggering a sync"}},"required":["success","error"]}}}}}},"delete":{"operationId":"deleteFeed","summary":"Delete a feed","tags":["Feeds"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Feed ID"},"required":true,"description":"Feed ID","name":"fid","in":"path"}],"responses":{"200":{"description":"Feed deleted","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]}},"required":["success"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}}}}},"/v1/feeds/{fid}/sync":{"post":{"operationId":"triggerSync","tags":["Syncs"],"summary":"Trigger a sync for a feed","description":"Creates a sync job and queues it for execution. By default, transaction feeds use incremental (cursor-based) syncing. Pass startDate and endDate (YYYY-MM-DD) in the JSON body for a specific date range. Trade feeds always require a date range. Poll GET /feeds/:fid/jobs/:jid to monitor progress.\n\nIf a previous sync is already running (or its lock is stuck), this endpoint returns 409. Two recovery options: set `forceCancelActive: true` to cancel the active sync and start a fresh one, or DELETE /feeds/:fid/jobs/:jid to cancel the specific in-flight job. Pass `resetCursors: true` to clear cursors before fetching (full re-sync); pass `skipDedup: true` to bypass per-record dedup for backfills.","security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Feed ID"},"required":true,"description":"Feed ID","name":"fid","in":"path"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriggerSyncBody"}}}},"responses":{"201":{"description":"Sync job created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"userId":{"type":"string"},"feedId":{"type":"string","description":"The feed this job belongs to"},"workspaceId":{"type":"string"},"status":{"type":"string","enum":["created","in_progress","paused","completed","failed","cancelled"]},"type":{"type":"string","enum":["manual","scheduled","webhook"]},"startDate":{"type":"string"},"endDate":{"type":"string"},"transactionsProcessed":{"type":"number"},"transactionsWritten":{"type":"number"},"errors":{"type":"array","items":{"type":"object","properties":{"timestamp":{"type":"string"},"message":{"type":"string"},"category":{"type":"string"},"severity":{"type":"string"}},"required":["timestamp","message"]}},"errorCategory":{"type":"string"},"workflowInstanceId":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"startedAt":{"type":"string"},"completedAt":{"type":"string"}},"required":["id","userId","feedId","status","type","transactionsProcessed","transactionsWritten","errors","createdAt","updatedAt"]}},"required":["success","data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"404":{"description":"Feed not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"409":{"description":"A sync job is already running for this feed (set forceCancelActive=true to override)","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}}}}},"/v1/feeds/{fid}/jobs":{"get":{"operationId":"listJobs","summary":"List jobs for a feed","tags":["Jobs"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Feed ID"},"required":true,"description":"Feed ID","name":"fid","in":"path"},{"schema":{"type":"integer","minimum":0,"exclusiveMinimum":true,"description":"Max results (default 20)"},"required":false,"description":"Max results (default 20)","name":"limit","in":"query"},{"schema":{"type":"string","enum":["created","in_progress","paused","completed","failed","cancelled"],"description":"Filter by job status"},"required":false,"description":"Filter by job status","name":"status","in":"query"}],"responses":{"200":{"description":"Job history for this feed","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"userId":{"type":"string"},"feedId":{"type":"string","description":"The feed this job belongs to"},"workspaceId":{"type":"string"},"status":{"type":"string","enum":["created","in_progress","paused","completed","failed","cancelled"]},"type":{"type":"string","enum":["manual","scheduled","webhook"]},"startDate":{"type":"string"},"endDate":{"type":"string"},"transactionsProcessed":{"type":"number"},"transactionsWritten":{"type":"number"},"errors":{"type":"array","items":{"type":"object","properties":{"timestamp":{"type":"string"},"message":{"type":"string"},"category":{"type":"string"},"severity":{"type":"string"}},"required":["timestamp","message"]}},"errorCategory":{"type":"string"},"workflowInstanceId":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"startedAt":{"type":"string"},"completedAt":{"type":"string"}},"required":["id","userId","feedId","status","type","transactionsProcessed","transactionsWritten","errors","createdAt","updatedAt"]}}},"required":["success","data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"404":{"description":"Feed not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}}}}},"/v1/feeds/{fid}/jobs/{jid}":{"get":{"operationId":"getJob","summary":"Get a job","tags":["Jobs"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Feed ID"},"required":true,"description":"Feed ID","name":"fid","in":"path"},{"schema":{"type":"string","description":"Job ID"},"required":true,"description":"Job ID","name":"jid","in":"path"}],"responses":{"200":{"description":"Job detail","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"userId":{"type":"string"},"feedId":{"type":"string","description":"The feed this job belongs to"},"workspaceId":{"type":"string"},"status":{"type":"string","enum":["created","in_progress","paused","completed","failed","cancelled"]},"type":{"type":"string","enum":["manual","scheduled","webhook"]},"startDate":{"type":"string"},"endDate":{"type":"string"},"transactionsProcessed":{"type":"number"},"transactionsWritten":{"type":"number"},"errors":{"type":"array","items":{"type":"object","properties":{"timestamp":{"type":"string"},"message":{"type":"string"},"category":{"type":"string"},"severity":{"type":"string"}},"required":["timestamp","message"]}},"errorCategory":{"type":"string"},"workflowInstanceId":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"startedAt":{"type":"string"},"completedAt":{"type":"string"}},"required":["id","userId","feedId","status","type","transactionsProcessed","transactionsWritten","errors","createdAt","updatedAt"]}},"required":["success","data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}}}},"delete":{"operationId":"cancelJob","tags":["Jobs"],"summary":"Cancel a job","description":"Cancels a created or in-progress job: terminates the workflow, releases the feed lock so the next sync can start, and marks the job `cancelled`. Returns 409 if the job is already completed/failed/cancelled.","security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Feed ID"},"required":true,"description":"Feed ID","name":"fid","in":"path"},{"schema":{"type":"string","description":"Job ID"},"required":true,"description":"Job ID","name":"jid","in":"path"}],"responses":{"200":{"description":"Job cancelled","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"userId":{"type":"string"},"feedId":{"type":"string","description":"The feed this job belongs to"},"workspaceId":{"type":"string"},"status":{"type":"string","enum":["created","in_progress","paused","completed","failed","cancelled"]},"type":{"type":"string","enum":["manual","scheduled","webhook"]},"startDate":{"type":"string"},"endDate":{"type":"string"},"transactionsProcessed":{"type":"number"},"transactionsWritten":{"type":"number"},"errors":{"type":"array","items":{"type":"object","properties":{"timestamp":{"type":"string"},"message":{"type":"string"},"category":{"type":"string"},"severity":{"type":"string"}},"required":["timestamp","message"]}},"errorCategory":{"type":"string"},"workflowInstanceId":{"type":"string"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"startedAt":{"type":"string"},"completedAt":{"type":"string"}},"required":["id","userId","feedId","status","type","transactionsProcessed","transactionsWritten","errors","createdAt","updatedAt"]}},"required":["success","data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"409":{"description":"Job already in terminal state","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}}}}},"/v1/feeds/{fid}/learn":{"post":{"operationId":"triggerLearn","tags":["Syncs"],"summary":"Trigger a learn cycle for a feed","description":"Immediately triggers the Memory enrichment learn phase for a feed, reading back destination records to update learned patterns. Bypasses the normal 30-second dedup guard. No-ops if no Memory enrichment is configured. Returns { triggered: true } when dispatched.","security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Feed ID"},"required":true,"description":"Feed ID","name":"fid","in":"path"}],"responses":{"200":{"description":"Learn cycle dispatched","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"triggered":{"type":"boolean","enum":[true]}},"required":["triggered"]}},"required":["success","data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"404":{"description":"Feed not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}}}}},"/v1/feeds/{fid}/enrich/preview":{"post":{"operationId":"previewEnrichment","tags":["Enrichments"],"summary":"Preview enrichment output for sample records","description":"Run the full enrichment pipeline (staged: memory fill, then rules, then alerts/observers) on up to 50 sample records without persisting anything. Returns each record with its original values, enriched values, and a list of changed fields. Also returns a per-enrichment match count summary (one entry per enrichment, tagged with its type). Useful for testing rule configs and seeing what Memory has learned before running a full sync.","security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Feed ID"},"required":true,"description":"Feed ID","name":"fid","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"records":{"type":"array","items":{"type":"object","additionalProperties":{"nullable":true}},"minItems":1,"maxItems":50,"description":"Sample records to enrich (max 50)"}},"required":["records"]}}}},"responses":{"200":{"description":"Enrichment preview","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"records":{"type":"array","items":{"type":"object","properties":{"original":{"type":"object","additionalProperties":{"nullable":true},"description":"Record as it came in"},"enriched":{"type":"object","additionalProperties":{"nullable":true},"description":"Record after all enrichments applied"},"changedFields":{"type":"array","items":{"type":"string"},"description":"Fields modified by enrichment"}},"required":["original","enriched","changedFields"]}},"summary":{"type":"object","properties":{"totalRecords":{"type":"number"},"enrichedCount":{"type":"number"},"entries":{"type":"array","items":{"type":"object","properties":{"enrichmentId":{"type":"string"},"enrichmentName":{"type":"string"},"type":{"type":"string","description":"Enrichment type id (e.g. 'rule', 'alert') — open set as types grow"},"matchCount":{"type":"number"},"errors":{"type":"number","description":"Non-fatal errors this enrichment hit (bad regex, handler throw, ...)"},"errorMessage":{"type":"string","description":"First error detail (≤200 chars). Present whenever `errors` is set"},"skipReason":{"type":"string","description":"Set when the enrichment did not execute at all (e.g. unknown type)"},"suppressedCount":{"type":"number","description":"Records a guard enrichment excluded from the sync"},"splitCount":{"type":"number","description":"Records replaced by split children"},"pairCount":{"type":"number","description":"Transfer/link pairs formed"},"aiPatternsResolved":{"type":"number","description":"Unique patterns an AI-fill enrichment resolved this run"}},"required":["enrichmentId","enrichmentName","type","matchCount"]}},"memory":{"type":"object","properties":{"patternsApplied":{"type":"number"},"fieldsAutoFilled":{"type":"number"}},"required":["patternsApplied","fieldsAutoFilled"]}},"required":["totalRecords","enrichedCount","entries"]}},"required":["records","summary"]}},"required":["success","data"]}}}},"400":{"description":"Invalid request body","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"404":{"description":"Feed not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}}}}},"/v1/enrichments":{"get":{"operationId":"listEnrichments","summary":"List enrichments","tags":["Enrichments"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"List of enrichments","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"emoji":{"type":"string"},"type":{"type":"string","enum":["rule","alert","memory","lookup","filter","split","transfer_match","dedupe","monitor","ai_categorize","ai_merchant","budget","recurring","fees","anomaly","digest"]},"enabled":{"type":"boolean"},"order":{"type":"number"},"dataType":{"type":"string","enum":["transactions","balances","trades","holdings","orders","loans","receipts","invoices","documents"]},"feedIds":{"type":"array","items":{"type":"string"}},"allFeeds":{"type":"boolean"},"ruleConfig":{"type":"object","properties":{"rules":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"conditions":{"$ref":"#/components/schemas/ConditionGroup"},"action":{"$ref":"#/components/schemas/RuleAction"}},"required":["conditions","action"]},"minItems":1}},"required":["rules"]},"alertConfig":{"type":"object","properties":{"conditions":{"$ref":"#/components/schemas/ConditionGroup"},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1},"cooldownMinutes":{"type":"integer","minimum":0,"maximum":10080}},"required":["conditions","destinations"]},"memoryConfig":{"type":"object","properties":{"patternField":{"type":"string"},"learnFields":{"type":"array","items":{"type":"string"}}}},"lookupConfig":{"type":"object","properties":{"matchField":{"type":"string","minLength":1},"matchMode":{"type":"string","enum":["exact","normalized","contains"]},"targetField":{"type":"string","minLength":1},"entries":{"type":"array","items":{"type":"object","properties":{"match":{"type":"string","minLength":1},"value":{"type":"string","minLength":1}},"required":["match","value"]},"maxItems":1000},"overwrite":{"type":"boolean"}},"required":["matchField","matchMode","targetField","entries"]},"filterConfig":{"type":"object","properties":{"conditions":{"$ref":"#/components/schemas/ConditionGroup"}},"required":["conditions"]},"splitConfig":{"type":"object","properties":{"conditions":{"$ref":"#/components/schemas/ConditionGroup"},"lines":{"type":"array","items":{"type":"object","properties":{"percent":{"type":"number","minimum":0,"exclusiveMinimum":true,"maximum":100},"fixedAmount":{"type":"number","minimum":0,"exclusiveMinimum":true},"remainder":{"type":"boolean"},"setFields":{"type":"object","additionalProperties":{"type":"string"}}}},"minItems":2,"maxItems":10}},"required":["conditions","lines"]},"transferMatchConfig":{"type":"object","properties":{"windowDays":{"type":"integer","minimum":1,"maximum":14},"action":{"type":"string","enum":["tag","suppressBoth","suppressOneLeg"]},"matchReversals":{"type":"boolean"}}},"dedupeConfig":{"type":"object","properties":{"windowDays":{"type":"integer","minimum":1,"maximum":7},"action":{"type":"string","enum":["flag","suppress"]}}},"monitorConfig":{"type":"object","properties":{"staleSyncHours":{"type":"integer","minimum":0,"maximum":720},"noRecordsDays":{"type":"integer","minimum":0,"maximum":90},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1},"cooldownHours":{"type":"integer","minimum":1,"maximum":168}},"required":["destinations"]},"aiCategorizeConfig":{"type":"object","properties":{"targetField":{"type":"string","minLength":1},"taxonomy":{"oneOf":[{"type":"object","properties":{"mode":{"type":"string","enum":["custom"]},"values":{"type":"array","items":{"type":"string","minLength":1,"maxLength":60},"minItems":1,"maxItems":200}},"required":["mode","values"]},{"type":"object","properties":{"mode":{"type":"string","enum":["learned"]}},"required":["mode"]},{"type":"object","properties":{"mode":{"type":"string","enum":["default"]}},"required":["mode"]}]},"confidenceThreshold":{"type":"number","minimum":0,"maximum":1},"maxPatternsPerSync":{"type":"integer","minimum":1,"maximum":2000}},"required":["taxonomy"]},"aiMerchantConfig":{"type":"object","properties":{}},"budgetConfig":{"type":"object","properties":{"dimension":{"type":"string","enum":["category","merchant","account","total"]},"dimensionValue":{"type":"string"},"metric":{"type":"string","enum":["outflowSum","inflowSum","net","count","latestBalance"]},"window":{"type":"string","enum":["mtd","rolling30d","rolling7d","qtd"]},"threshold":{"type":"number"},"currency":{"type":"string","minLength":1},"direction":{"type":"string","enum":["above","below"]},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1},"cooldownHours":{"type":"integer","minimum":1,"maximum":168}},"required":["dimension","metric","window","threshold","currency","direction","destinations"]},"recurringConfig":{"type":"object","properties":{"priceIncreasePercent":{"type":"number","minimum":0,"maximum":500},"alertOnNewRecurring":{"type":"boolean"},"missedChargeGraceDays":{"type":"number","minimum":0,"maximum":60},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1}},"required":["destinations"]},"feesConfig":{"type":"object","properties":{"creepPercent":{"type":"number","minimum":1,"maximum":500},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1}},"required":["destinations"]},"anomalyConfig":{"type":"object","properties":{"newMerchantOverAmount":{"type":"number","minimum":0},"amountSpikeSigma":{"type":"number","minimum":0,"maximum":10},"velocityCount":{"type":"number","minimum":0},"velocitySum":{"type":"number","minimum":0},"velocityWindowHours":{"type":"number","minimum":1,"maximum":336},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1},"maxAlertsPerDay":{"type":"integer","minimum":1,"maximum":100}},"required":["destinations"]},"digestConfig":{"type":"object","properties":{"cadence":{"type":"string","enum":["daily","weekly","monthly"]},"hourUtc":{"type":"integer","minimum":0,"maximum":23},"sections":{"type":"array","items":{"type":"string"},"minItems":1},"tone":{"type":"string","enum":["owner","advisor","team"]},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1},"skipWhenQuiet":{"type":"boolean"}},"required":["cadence","destinations"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"createdBy":{"type":"string"}},"required":["id","name","type","enabled","order","dataType","feedIds","allFeeds","createdAt","updatedAt","createdBy"]}}},"required":["success","data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}}}},"post":{"operationId":"createEnrichment","summary":"Create an enrichment","tags":["Enrichments"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"emoji":{"type":"string"},"type":{"type":"string","enum":["rule","alert","memory","lookup","filter","split","transfer_match","dedupe","monitor","ai_categorize","ai_merchant","budget","recurring","fees","anomaly","digest"]},"enabled":{"type":"boolean"},"dataType":{"type":"string","enum":["transactions","balances","trades","holdings","orders","loans","receipts","invoices","documents"]},"feedIds":{"type":"array","items":{"type":"string"}},"allFeeds":{"type":"boolean"},"ruleConfig":{"type":"object","properties":{"rules":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"conditions":{"$ref":"#/components/schemas/ConditionGroup"},"action":{"$ref":"#/components/schemas/RuleAction"}},"required":["conditions","action"]},"minItems":1}},"required":["rules"]},"alertConfig":{"type":"object","properties":{"conditions":{"$ref":"#/components/schemas/ConditionGroup"},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1},"cooldownMinutes":{"type":"integer","minimum":0,"maximum":10080}},"required":["conditions","destinations"]},"memoryConfig":{"type":"object","properties":{"patternField":{"type":"string"},"learnFields":{"type":"array","items":{"type":"string"}}}},"lookupConfig":{"type":"object","properties":{"matchField":{"type":"string","minLength":1},"matchMode":{"type":"string","enum":["exact","normalized","contains"]},"targetField":{"type":"string","minLength":1},"entries":{"type":"array","items":{"type":"object","properties":{"match":{"type":"string","minLength":1},"value":{"type":"string","minLength":1}},"required":["match","value"]},"maxItems":1000},"overwrite":{"type":"boolean"}},"required":["matchField","matchMode","targetField","entries"]},"filterConfig":{"type":"object","properties":{"conditions":{"$ref":"#/components/schemas/ConditionGroup"}},"required":["conditions"]},"splitConfig":{"type":"object","properties":{"conditions":{"$ref":"#/components/schemas/ConditionGroup"},"lines":{"type":"array","items":{"type":"object","properties":{"percent":{"type":"number","minimum":0,"exclusiveMinimum":true,"maximum":100},"fixedAmount":{"type":"number","minimum":0,"exclusiveMinimum":true},"remainder":{"type":"boolean"},"setFields":{"type":"object","additionalProperties":{"type":"string"}}}},"minItems":2,"maxItems":10}},"required":["conditions","lines"]},"transferMatchConfig":{"type":"object","properties":{"windowDays":{"type":"integer","minimum":1,"maximum":14},"action":{"type":"string","enum":["tag","suppressBoth","suppressOneLeg"]},"matchReversals":{"type":"boolean"}}},"dedupeConfig":{"type":"object","properties":{"windowDays":{"type":"integer","minimum":1,"maximum":7},"action":{"type":"string","enum":["flag","suppress"]}}},"monitorConfig":{"type":"object","properties":{"staleSyncHours":{"type":"integer","minimum":0,"maximum":720},"noRecordsDays":{"type":"integer","minimum":0,"maximum":90},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1},"cooldownHours":{"type":"integer","minimum":1,"maximum":168}},"required":["destinations"]},"aiCategorizeConfig":{"type":"object","properties":{"targetField":{"type":"string","minLength":1},"taxonomy":{"oneOf":[{"type":"object","properties":{"mode":{"type":"string","enum":["custom"]},"values":{"type":"array","items":{"type":"string","minLength":1,"maxLength":60},"minItems":1,"maxItems":200}},"required":["mode","values"]},{"type":"object","properties":{"mode":{"type":"string","enum":["learned"]}},"required":["mode"]},{"type":"object","properties":{"mode":{"type":"string","enum":["default"]}},"required":["mode"]}]},"confidenceThreshold":{"type":"number","minimum":0,"maximum":1},"maxPatternsPerSync":{"type":"integer","minimum":1,"maximum":2000}},"required":["taxonomy"]},"aiMerchantConfig":{"type":"object","properties":{}},"budgetConfig":{"type":"object","properties":{"dimension":{"type":"string","enum":["category","merchant","account","total"]},"dimensionValue":{"type":"string"},"metric":{"type":"string","enum":["outflowSum","inflowSum","net","count","latestBalance"]},"window":{"type":"string","enum":["mtd","rolling30d","rolling7d","qtd"]},"threshold":{"type":"number"},"currency":{"type":"string","minLength":1},"direction":{"type":"string","enum":["above","below"]},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1},"cooldownHours":{"type":"integer","minimum":1,"maximum":168}},"required":["dimension","metric","window","threshold","currency","direction","destinations"]},"recurringConfig":{"type":"object","properties":{"priceIncreasePercent":{"type":"number","minimum":0,"maximum":500},"alertOnNewRecurring":{"type":"boolean"},"missedChargeGraceDays":{"type":"number","minimum":0,"maximum":60},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1}},"required":["destinations"]},"feesConfig":{"type":"object","properties":{"creepPercent":{"type":"number","minimum":1,"maximum":500},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1}},"required":["destinations"]},"anomalyConfig":{"type":"object","properties":{"newMerchantOverAmount":{"type":"number","minimum":0},"amountSpikeSigma":{"type":"number","minimum":0,"maximum":10},"velocityCount":{"type":"number","minimum":0},"velocitySum":{"type":"number","minimum":0},"velocityWindowHours":{"type":"number","minimum":1,"maximum":336},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1},"maxAlertsPerDay":{"type":"integer","minimum":1,"maximum":100}},"required":["destinations"]},"digestConfig":{"type":"object","properties":{"cadence":{"type":"string","enum":["daily","weekly","monthly"]},"hourUtc":{"type":"integer","minimum":0,"maximum":23},"sections":{"type":"array","items":{"type":"string"},"minItems":1},"tone":{"type":"string","enum":["owner","advisor","team"]},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1},"skipWhenQuiet":{"type":"boolean"}},"required":["cadence","destinations"]}},"required":["name","type","dataType"]}}}},"responses":{"201":{"description":"Enrichment created","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"emoji":{"type":"string"},"type":{"type":"string","enum":["rule","alert","memory","lookup","filter","split","transfer_match","dedupe","monitor","ai_categorize","ai_merchant","budget","recurring","fees","anomaly","digest"]},"enabled":{"type":"boolean"},"order":{"type":"number"},"dataType":{"type":"string","enum":["transactions","balances","trades","holdings","orders","loans","receipts","invoices","documents"]},"feedIds":{"type":"array","items":{"type":"string"}},"allFeeds":{"type":"boolean"},"ruleConfig":{"type":"object","properties":{"rules":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"conditions":{"$ref":"#/components/schemas/ConditionGroup"},"action":{"$ref":"#/components/schemas/RuleAction"}},"required":["conditions","action"]},"minItems":1}},"required":["rules"]},"alertConfig":{"type":"object","properties":{"conditions":{"$ref":"#/components/schemas/ConditionGroup"},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1},"cooldownMinutes":{"type":"integer","minimum":0,"maximum":10080}},"required":["conditions","destinations"]},"memoryConfig":{"type":"object","properties":{"patternField":{"type":"string"},"learnFields":{"type":"array","items":{"type":"string"}}}},"lookupConfig":{"type":"object","properties":{"matchField":{"type":"string","minLength":1},"matchMode":{"type":"string","enum":["exact","normalized","contains"]},"targetField":{"type":"string","minLength":1},"entries":{"type":"array","items":{"type":"object","properties":{"match":{"type":"string","minLength":1},"value":{"type":"string","minLength":1}},"required":["match","value"]},"maxItems":1000},"overwrite":{"type":"boolean"}},"required":["matchField","matchMode","targetField","entries"]},"filterConfig":{"type":"object","properties":{"conditions":{"$ref":"#/components/schemas/ConditionGroup"}},"required":["conditions"]},"splitConfig":{"type":"object","properties":{"conditions":{"$ref":"#/components/schemas/ConditionGroup"},"lines":{"type":"array","items":{"type":"object","properties":{"percent":{"type":"number","minimum":0,"exclusiveMinimum":true,"maximum":100},"fixedAmount":{"type":"number","minimum":0,"exclusiveMinimum":true},"remainder":{"type":"boolean"},"setFields":{"type":"object","additionalProperties":{"type":"string"}}}},"minItems":2,"maxItems":10}},"required":["conditions","lines"]},"transferMatchConfig":{"type":"object","properties":{"windowDays":{"type":"integer","minimum":1,"maximum":14},"action":{"type":"string","enum":["tag","suppressBoth","suppressOneLeg"]},"matchReversals":{"type":"boolean"}}},"dedupeConfig":{"type":"object","properties":{"windowDays":{"type":"integer","minimum":1,"maximum":7},"action":{"type":"string","enum":["flag","suppress"]}}},"monitorConfig":{"type":"object","properties":{"staleSyncHours":{"type":"integer","minimum":0,"maximum":720},"noRecordsDays":{"type":"integer","minimum":0,"maximum":90},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1},"cooldownHours":{"type":"integer","minimum":1,"maximum":168}},"required":["destinations"]},"aiCategorizeConfig":{"type":"object","properties":{"targetField":{"type":"string","minLength":1},"taxonomy":{"oneOf":[{"type":"object","properties":{"mode":{"type":"string","enum":["custom"]},"values":{"type":"array","items":{"type":"string","minLength":1,"maxLength":60},"minItems":1,"maxItems":200}},"required":["mode","values"]},{"type":"object","properties":{"mode":{"type":"string","enum":["learned"]}},"required":["mode"]},{"type":"object","properties":{"mode":{"type":"string","enum":["default"]}},"required":["mode"]}]},"confidenceThreshold":{"type":"number","minimum":0,"maximum":1},"maxPatternsPerSync":{"type":"integer","minimum":1,"maximum":2000}},"required":["taxonomy"]},"aiMerchantConfig":{"type":"object","properties":{}},"budgetConfig":{"type":"object","properties":{"dimension":{"type":"string","enum":["category","merchant","account","total"]},"dimensionValue":{"type":"string"},"metric":{"type":"string","enum":["outflowSum","inflowSum","net","count","latestBalance"]},"window":{"type":"string","enum":["mtd","rolling30d","rolling7d","qtd"]},"threshold":{"type":"number"},"currency":{"type":"string","minLength":1},"direction":{"type":"string","enum":["above","below"]},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1},"cooldownHours":{"type":"integer","minimum":1,"maximum":168}},"required":["dimension","metric","window","threshold","currency","direction","destinations"]},"recurringConfig":{"type":"object","properties":{"priceIncreasePercent":{"type":"number","minimum":0,"maximum":500},"alertOnNewRecurring":{"type":"boolean"},"missedChargeGraceDays":{"type":"number","minimum":0,"maximum":60},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1}},"required":["destinations"]},"feesConfig":{"type":"object","properties":{"creepPercent":{"type":"number","minimum":1,"maximum":500},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1}},"required":["destinations"]},"anomalyConfig":{"type":"object","properties":{"newMerchantOverAmount":{"type":"number","minimum":0},"amountSpikeSigma":{"type":"number","minimum":0,"maximum":10},"velocityCount":{"type":"number","minimum":0},"velocitySum":{"type":"number","minimum":0},"velocityWindowHours":{"type":"number","minimum":1,"maximum":336},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1},"maxAlertsPerDay":{"type":"integer","minimum":1,"maximum":100}},"required":["destinations"]},"digestConfig":{"type":"object","properties":{"cadence":{"type":"string","enum":["daily","weekly","monthly"]},"hourUtc":{"type":"integer","minimum":0,"maximum":23},"sections":{"type":"array","items":{"type":"string"},"minItems":1},"tone":{"type":"string","enum":["owner","advisor","team"]},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1},"skipWhenQuiet":{"type":"boolean"}},"required":["cadence","destinations"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"createdBy":{"type":"string"}},"required":["id","name","type","enabled","order","dataType","feedIds","allFeeds","createdAt","updatedAt","createdBy"]}},"required":["success","data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}}}}},"/v1/enrichments/{eid}":{"get":{"operationId":"getEnrichment","summary":"Get an enrichment","tags":["Enrichments"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Enrichment ID"},"required":true,"description":"Enrichment ID","name":"eid","in":"path"}],"responses":{"200":{"description":"Enrichment detail","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"emoji":{"type":"string"},"type":{"type":"string","enum":["rule","alert","memory","lookup","filter","split","transfer_match","dedupe","monitor","ai_categorize","ai_merchant","budget","recurring","fees","anomaly","digest"]},"enabled":{"type":"boolean"},"order":{"type":"number"},"dataType":{"type":"string","enum":["transactions","balances","trades","holdings","orders","loans","receipts","invoices","documents"]},"feedIds":{"type":"array","items":{"type":"string"}},"allFeeds":{"type":"boolean"},"ruleConfig":{"type":"object","properties":{"rules":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"conditions":{"$ref":"#/components/schemas/ConditionGroup"},"action":{"$ref":"#/components/schemas/RuleAction"}},"required":["conditions","action"]},"minItems":1}},"required":["rules"]},"alertConfig":{"type":"object","properties":{"conditions":{"$ref":"#/components/schemas/ConditionGroup"},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1},"cooldownMinutes":{"type":"integer","minimum":0,"maximum":10080}},"required":["conditions","destinations"]},"memoryConfig":{"type":"object","properties":{"patternField":{"type":"string"},"learnFields":{"type":"array","items":{"type":"string"}}}},"lookupConfig":{"type":"object","properties":{"matchField":{"type":"string","minLength":1},"matchMode":{"type":"string","enum":["exact","normalized","contains"]},"targetField":{"type":"string","minLength":1},"entries":{"type":"array","items":{"type":"object","properties":{"match":{"type":"string","minLength":1},"value":{"type":"string","minLength":1}},"required":["match","value"]},"maxItems":1000},"overwrite":{"type":"boolean"}},"required":["matchField","matchMode","targetField","entries"]},"filterConfig":{"type":"object","properties":{"conditions":{"$ref":"#/components/schemas/ConditionGroup"}},"required":["conditions"]},"splitConfig":{"type":"object","properties":{"conditions":{"$ref":"#/components/schemas/ConditionGroup"},"lines":{"type":"array","items":{"type":"object","properties":{"percent":{"type":"number","minimum":0,"exclusiveMinimum":true,"maximum":100},"fixedAmount":{"type":"number","minimum":0,"exclusiveMinimum":true},"remainder":{"type":"boolean"},"setFields":{"type":"object","additionalProperties":{"type":"string"}}}},"minItems":2,"maxItems":10}},"required":["conditions","lines"]},"transferMatchConfig":{"type":"object","properties":{"windowDays":{"type":"integer","minimum":1,"maximum":14},"action":{"type":"string","enum":["tag","suppressBoth","suppressOneLeg"]},"matchReversals":{"type":"boolean"}}},"dedupeConfig":{"type":"object","properties":{"windowDays":{"type":"integer","minimum":1,"maximum":7},"action":{"type":"string","enum":["flag","suppress"]}}},"monitorConfig":{"type":"object","properties":{"staleSyncHours":{"type":"integer","minimum":0,"maximum":720},"noRecordsDays":{"type":"integer","minimum":0,"maximum":90},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1},"cooldownHours":{"type":"integer","minimum":1,"maximum":168}},"required":["destinations"]},"aiCategorizeConfig":{"type":"object","properties":{"targetField":{"type":"string","minLength":1},"taxonomy":{"oneOf":[{"type":"object","properties":{"mode":{"type":"string","enum":["custom"]},"values":{"type":"array","items":{"type":"string","minLength":1,"maxLength":60},"minItems":1,"maxItems":200}},"required":["mode","values"]},{"type":"object","properties":{"mode":{"type":"string","enum":["learned"]}},"required":["mode"]},{"type":"object","properties":{"mode":{"type":"string","enum":["default"]}},"required":["mode"]}]},"confidenceThreshold":{"type":"number","minimum":0,"maximum":1},"maxPatternsPerSync":{"type":"integer","minimum":1,"maximum":2000}},"required":["taxonomy"]},"aiMerchantConfig":{"type":"object","properties":{}},"budgetConfig":{"type":"object","properties":{"dimension":{"type":"string","enum":["category","merchant","account","total"]},"dimensionValue":{"type":"string"},"metric":{"type":"string","enum":["outflowSum","inflowSum","net","count","latestBalance"]},"window":{"type":"string","enum":["mtd","rolling30d","rolling7d","qtd"]},"threshold":{"type":"number"},"currency":{"type":"string","minLength":1},"direction":{"type":"string","enum":["above","below"]},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1},"cooldownHours":{"type":"integer","minimum":1,"maximum":168}},"required":["dimension","metric","window","threshold","currency","direction","destinations"]},"recurringConfig":{"type":"object","properties":{"priceIncreasePercent":{"type":"number","minimum":0,"maximum":500},"alertOnNewRecurring":{"type":"boolean"},"missedChargeGraceDays":{"type":"number","minimum":0,"maximum":60},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1}},"required":["destinations"]},"feesConfig":{"type":"object","properties":{"creepPercent":{"type":"number","minimum":1,"maximum":500},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1}},"required":["destinations"]},"anomalyConfig":{"type":"object","properties":{"newMerchantOverAmount":{"type":"number","minimum":0},"amountSpikeSigma":{"type":"number","minimum":0,"maximum":10},"velocityCount":{"type":"number","minimum":0},"velocitySum":{"type":"number","minimum":0},"velocityWindowHours":{"type":"number","minimum":1,"maximum":336},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1},"maxAlertsPerDay":{"type":"integer","minimum":1,"maximum":100}},"required":["destinations"]},"digestConfig":{"type":"object","properties":{"cadence":{"type":"string","enum":["daily","weekly","monthly"]},"hourUtc":{"type":"integer","minimum":0,"maximum":23},"sections":{"type":"array","items":{"type":"string"},"minItems":1},"tone":{"type":"string","enum":["owner","advisor","team"]},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1},"skipWhenQuiet":{"type":"boolean"}},"required":["cadence","destinations"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"createdBy":{"type":"string"}},"required":["id","name","type","enabled","order","dataType","feedIds","allFeeds","createdAt","updatedAt","createdBy"]}},"required":["success","data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}}}},"put":{"operationId":"updateEnrichment","summary":"Update an enrichment","tags":["Enrichments"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Enrichment ID"},"required":true,"description":"Enrichment ID","name":"eid","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"emoji":{"type":"string"},"enabled":{"type":"boolean"},"order":{"type":"integer","minimum":0},"dataType":{"type":"string","enum":["transactions","balances","trades","holdings","orders","loans","receipts","invoices","documents"]},"feedIds":{"type":"array","items":{"type":"string"}},"allFeeds":{"type":"boolean"},"ruleConfig":{"type":"object","properties":{"rules":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"conditions":{"$ref":"#/components/schemas/ConditionGroup"},"action":{"$ref":"#/components/schemas/RuleAction"}},"required":["conditions","action"]},"minItems":1}},"required":["rules"]},"alertConfig":{"type":"object","properties":{"conditions":{"$ref":"#/components/schemas/ConditionGroup"},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1},"cooldownMinutes":{"type":"integer","minimum":0,"maximum":10080}},"required":["conditions","destinations"]},"memoryConfig":{"type":"object","properties":{"patternField":{"type":"string"},"learnFields":{"type":"array","items":{"type":"string"}}}},"lookupConfig":{"type":"object","properties":{"matchField":{"type":"string","minLength":1},"matchMode":{"type":"string","enum":["exact","normalized","contains"]},"targetField":{"type":"string","minLength":1},"entries":{"type":"array","items":{"type":"object","properties":{"match":{"type":"string","minLength":1},"value":{"type":"string","minLength":1}},"required":["match","value"]},"maxItems":1000},"overwrite":{"type":"boolean"}},"required":["matchField","matchMode","targetField","entries"]},"filterConfig":{"type":"object","properties":{"conditions":{"$ref":"#/components/schemas/ConditionGroup"}},"required":["conditions"]},"splitConfig":{"type":"object","properties":{"conditions":{"$ref":"#/components/schemas/ConditionGroup"},"lines":{"type":"array","items":{"type":"object","properties":{"percent":{"type":"number","minimum":0,"exclusiveMinimum":true,"maximum":100},"fixedAmount":{"type":"number","minimum":0,"exclusiveMinimum":true},"remainder":{"type":"boolean"},"setFields":{"type":"object","additionalProperties":{"type":"string"}}}},"minItems":2,"maxItems":10}},"required":["conditions","lines"]},"transferMatchConfig":{"type":"object","properties":{"windowDays":{"type":"integer","minimum":1,"maximum":14},"action":{"type":"string","enum":["tag","suppressBoth","suppressOneLeg"]},"matchReversals":{"type":"boolean"}}},"dedupeConfig":{"type":"object","properties":{"windowDays":{"type":"integer","minimum":1,"maximum":7},"action":{"type":"string","enum":["flag","suppress"]}}},"monitorConfig":{"type":"object","properties":{"staleSyncHours":{"type":"integer","minimum":0,"maximum":720},"noRecordsDays":{"type":"integer","minimum":0,"maximum":90},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1},"cooldownHours":{"type":"integer","minimum":1,"maximum":168}},"required":["destinations"]},"aiCategorizeConfig":{"type":"object","properties":{"targetField":{"type":"string","minLength":1},"taxonomy":{"oneOf":[{"type":"object","properties":{"mode":{"type":"string","enum":["custom"]},"values":{"type":"array","items":{"type":"string","minLength":1,"maxLength":60},"minItems":1,"maxItems":200}},"required":["mode","values"]},{"type":"object","properties":{"mode":{"type":"string","enum":["learned"]}},"required":["mode"]},{"type":"object","properties":{"mode":{"type":"string","enum":["default"]}},"required":["mode"]}]},"confidenceThreshold":{"type":"number","minimum":0,"maximum":1},"maxPatternsPerSync":{"type":"integer","minimum":1,"maximum":2000}},"required":["taxonomy"]},"aiMerchantConfig":{"type":"object","properties":{}},"budgetConfig":{"type":"object","properties":{"dimension":{"type":"string","enum":["category","merchant","account","total"]},"dimensionValue":{"type":"string"},"metric":{"type":"string","enum":["outflowSum","inflowSum","net","count","latestBalance"]},"window":{"type":"string","enum":["mtd","rolling30d","rolling7d","qtd"]},"threshold":{"type":"number"},"currency":{"type":"string","minLength":1},"direction":{"type":"string","enum":["above","below"]},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1},"cooldownHours":{"type":"integer","minimum":1,"maximum":168}},"required":["dimension","metric","window","threshold","currency","direction","destinations"]},"recurringConfig":{"type":"object","properties":{"priceIncreasePercent":{"type":"number","minimum":0,"maximum":500},"alertOnNewRecurring":{"type":"boolean"},"missedChargeGraceDays":{"type":"number","minimum":0,"maximum":60},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1}},"required":["destinations"]},"feesConfig":{"type":"object","properties":{"creepPercent":{"type":"number","minimum":1,"maximum":500},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1}},"required":["destinations"]},"anomalyConfig":{"type":"object","properties":{"newMerchantOverAmount":{"type":"number","minimum":0},"amountSpikeSigma":{"type":"number","minimum":0,"maximum":10},"velocityCount":{"type":"number","minimum":0},"velocitySum":{"type":"number","minimum":0},"velocityWindowHours":{"type":"number","minimum":1,"maximum":336},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1},"maxAlertsPerDay":{"type":"integer","minimum":1,"maximum":100}},"required":["destinations"]},"digestConfig":{"type":"object","properties":{"cadence":{"type":"string","enum":["daily","weekly","monthly"]},"hourUtc":{"type":"integer","minimum":0,"maximum":23},"sections":{"type":"array","items":{"type":"string"},"minItems":1},"tone":{"type":"string","enum":["owner","advisor","team"]},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1},"skipWhenQuiet":{"type":"boolean"}},"required":["cadence","destinations"]}}}}}},"responses":{"200":{"description":"Enrichment updated","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"emoji":{"type":"string"},"type":{"type":"string","enum":["rule","alert","memory","lookup","filter","split","transfer_match","dedupe","monitor","ai_categorize","ai_merchant","budget","recurring","fees","anomaly","digest"]},"enabled":{"type":"boolean"},"order":{"type":"number"},"dataType":{"type":"string","enum":["transactions","balances","trades","holdings","orders","loans","receipts","invoices","documents"]},"feedIds":{"type":"array","items":{"type":"string"}},"allFeeds":{"type":"boolean"},"ruleConfig":{"type":"object","properties":{"rules":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"conditions":{"$ref":"#/components/schemas/ConditionGroup"},"action":{"$ref":"#/components/schemas/RuleAction"}},"required":["conditions","action"]},"minItems":1}},"required":["rules"]},"alertConfig":{"type":"object","properties":{"conditions":{"$ref":"#/components/schemas/ConditionGroup"},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1},"cooldownMinutes":{"type":"integer","minimum":0,"maximum":10080}},"required":["conditions","destinations"]},"memoryConfig":{"type":"object","properties":{"patternField":{"type":"string"},"learnFields":{"type":"array","items":{"type":"string"}}}},"lookupConfig":{"type":"object","properties":{"matchField":{"type":"string","minLength":1},"matchMode":{"type":"string","enum":["exact","normalized","contains"]},"targetField":{"type":"string","minLength":1},"entries":{"type":"array","items":{"type":"object","properties":{"match":{"type":"string","minLength":1},"value":{"type":"string","minLength":1}},"required":["match","value"]},"maxItems":1000},"overwrite":{"type":"boolean"}},"required":["matchField","matchMode","targetField","entries"]},"filterConfig":{"type":"object","properties":{"conditions":{"$ref":"#/components/schemas/ConditionGroup"}},"required":["conditions"]},"splitConfig":{"type":"object","properties":{"conditions":{"$ref":"#/components/schemas/ConditionGroup"},"lines":{"type":"array","items":{"type":"object","properties":{"percent":{"type":"number","minimum":0,"exclusiveMinimum":true,"maximum":100},"fixedAmount":{"type":"number","minimum":0,"exclusiveMinimum":true},"remainder":{"type":"boolean"},"setFields":{"type":"object","additionalProperties":{"type":"string"}}}},"minItems":2,"maxItems":10}},"required":["conditions","lines"]},"transferMatchConfig":{"type":"object","properties":{"windowDays":{"type":"integer","minimum":1,"maximum":14},"action":{"type":"string","enum":["tag","suppressBoth","suppressOneLeg"]},"matchReversals":{"type":"boolean"}}},"dedupeConfig":{"type":"object","properties":{"windowDays":{"type":"integer","minimum":1,"maximum":7},"action":{"type":"string","enum":["flag","suppress"]}}},"monitorConfig":{"type":"object","properties":{"staleSyncHours":{"type":"integer","minimum":0,"maximum":720},"noRecordsDays":{"type":"integer","minimum":0,"maximum":90},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1},"cooldownHours":{"type":"integer","minimum":1,"maximum":168}},"required":["destinations"]},"aiCategorizeConfig":{"type":"object","properties":{"targetField":{"type":"string","minLength":1},"taxonomy":{"oneOf":[{"type":"object","properties":{"mode":{"type":"string","enum":["custom"]},"values":{"type":"array","items":{"type":"string","minLength":1,"maxLength":60},"minItems":1,"maxItems":200}},"required":["mode","values"]},{"type":"object","properties":{"mode":{"type":"string","enum":["learned"]}},"required":["mode"]},{"type":"object","properties":{"mode":{"type":"string","enum":["default"]}},"required":["mode"]}]},"confidenceThreshold":{"type":"number","minimum":0,"maximum":1},"maxPatternsPerSync":{"type":"integer","minimum":1,"maximum":2000}},"required":["taxonomy"]},"aiMerchantConfig":{"type":"object","properties":{}},"budgetConfig":{"type":"object","properties":{"dimension":{"type":"string","enum":["category","merchant","account","total"]},"dimensionValue":{"type":"string"},"metric":{"type":"string","enum":["outflowSum","inflowSum","net","count","latestBalance"]},"window":{"type":"string","enum":["mtd","rolling30d","rolling7d","qtd"]},"threshold":{"type":"number"},"currency":{"type":"string","minLength":1},"direction":{"type":"string","enum":["above","below"]},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1},"cooldownHours":{"type":"integer","minimum":1,"maximum":168}},"required":["dimension","metric","window","threshold","currency","direction","destinations"]},"recurringConfig":{"type":"object","properties":{"priceIncreasePercent":{"type":"number","minimum":0,"maximum":500},"alertOnNewRecurring":{"type":"boolean"},"missedChargeGraceDays":{"type":"number","minimum":0,"maximum":60},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1}},"required":["destinations"]},"feesConfig":{"type":"object","properties":{"creepPercent":{"type":"number","minimum":1,"maximum":500},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1}},"required":["destinations"]},"anomalyConfig":{"type":"object","properties":{"newMerchantOverAmount":{"type":"number","minimum":0},"amountSpikeSigma":{"type":"number","minimum":0,"maximum":10},"velocityCount":{"type":"number","minimum":0},"velocitySum":{"type":"number","minimum":0},"velocityWindowHours":{"type":"number","minimum":1,"maximum":336},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1},"maxAlertsPerDay":{"type":"integer","minimum":1,"maximum":100}},"required":["destinations"]},"digestConfig":{"type":"object","properties":{"cadence":{"type":"string","enum":["daily","weekly","monthly"]},"hourUtc":{"type":"integer","minimum":0,"maximum":23},"sections":{"type":"array","items":{"type":"string"},"minItems":1},"tone":{"type":"string","enum":["owner","advisor","team"]},"destinations":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["email"]},"recipients":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","recipients"]},{"type":"object","properties":{"type":{"type":"string","enum":["slack"]},"webhookUrl":{"type":"string"}},"required":["type","webhookUrl"]},{"type":"object","properties":{"type":{"type":"string","enum":["webhook"]},"url":{"type":"string"},"headers":{"type":"object","additionalProperties":{"type":"string"}}},"required":["type","url"]},{"type":"object","properties":{"type":{"type":"string","enum":["sms"]},"phoneNumbers":{"type":"array","items":{"type":"string"},"minItems":1}},"required":["type","phoneNumbers"]}]},"minItems":1},"skipWhenQuiet":{"type":"boolean"}},"required":["cadence","destinations"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"createdBy":{"type":"string"}},"required":["id","name","type","enabled","order","dataType","feedIds","allFeeds","createdAt","updatedAt","createdBy"]}},"required":["success","data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}}}},"delete":{"operationId":"deleteEnrichment","summary":"Delete an enrichment","tags":["Enrichments"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Enrichment ID"},"required":true,"description":"Enrichment ID","name":"eid","in":"path"}],"responses":{"200":{"description":"Enrichment deleted","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]}},"required":["success"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}}}}},"/v1/whoami":{"get":{"operationId":"whoami","summary":"Describe the current credential","description":"Returns the workspace, auth method, scopes, and plan for the authenticated credential. On the Firebase web-session path the workspace comes from the `X-Workspace-ID` header and membership is verified; API keys and OAuth tokens are bound to a single workspace.","tags":["Workspace"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"The calling credential and its bound workspace.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"workspaceId":{"type":"string","nullable":true,"description":"The workspace this credential is bound to. Null on a session with no workspace selected."},"workspaceName":{"type":"string","nullable":true,"description":"Display name of the workspace."},"authMethod":{"type":"string","enum":["apiKey","oauth","firebase"],"description":"How the request authenticated: `apiKey` (X-API-Key), `oauth` (Bearer JWT), or `firebase` (web session)."},"scopes":{"type":"array","items":{"type":"string"},"description":"Scopes granted to this credential (`resource:action`). Firebase sessions receive all scopes."},"planTier":{"type":"string","nullable":true,"description":"Subscription plan of the workspace (e.g. `free`, `starter`, `professional`, `business`, `enterprise`)."}},"required":["workspaceId","workspaceName","authMethod","scopes","planTier"],"description":"Identity of the calling credential and its bound workspace. Powers `banksync whoami`, `banksync status`, and the CLI deep-link connect flow."}},"required":["success","data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"403":{"description":"Forbidden — the caller is not a member of the requested workspace","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}}}}},"/v1/integrations":{"get":{"operationId":"listIntegrations","summary":"List connected integrations","description":"List integrations connected to the current workspace. Pass `?scope=family` to include integrations from every portal under this workspace. Family scope requires admin+ role and is only valid on a top-level workspace. Provider auth tokens are stripped from all responses.","tags":["Integrations"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","enum":["self","family"],"description":"Resource scope. `self` (default) returns this workspace only. `family` includes every portal under it; each row gains `workspaceId` + `portal: { id, name, icon } | null`. Admin+ only, top-level workspaces only."},"required":false,"description":"Resource scope. `self` (default) returns this workspace only. `family` includes every portal under it; each row gains `workspaceId` + `portal: { id, name, icon } | null`. Admin+ only, top-level workspaces only.","name":"scope","in":"query"}],"responses":{"200":{"description":"List of integrations (auth tokens excluded). With `scope=family`, each row additionally carries `workspaceId` and `portal`.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"type":"string","enum":["notion","google_sheets","airtable","excel","database","webhook"]},"iconUrl":{"type":"string"},"databaseIntegration":{"type":"object","additionalProperties":{"nullable":true}},"webhookIntegration":{"type":"object","additionalProperties":{"nullable":true}},"icon":{"type":"string"},"order":{"type":"number"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","name","type","iconUrl","order","createdAt","updatedAt"]}}},"required":["success","data"]}}}},"400":{"description":"Invalid `scope` value, or `scope=family` was requested against a portal workspace","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"403":{"description":"Forbidden — `scope=family` requires admin+ role","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}}}}},"/v1/integrations/{iid}":{"delete":{"operationId":"deleteIntegration","summary":"Remove an integration","tags":["Integrations"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Integration ID"},"required":true,"description":"Integration ID","name":"iid","in":"path"}],"responses":{"200":{"description":"Integration removed from workspace","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"deleted":{"type":"boolean","enum":[true]}},"required":["deleted"]}},"required":["success","data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}}}}},"/v1/api-keys":{"get":{"operationId":"listApiKeys","summary":"List API keys for this workspace","tags":["API Keys"],"security":[{"apiKey":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"Active API keys for this workspace (keyHash never returned)","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"keyPrefix":{"type":"string","description":"First 8 chars of the key for display (e.g. bsk_a3f5)"},"name":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"isActive":{"type":"boolean"},"expiresAt":{"type":"string","nullable":true},"createdAt":{"type":"string"},"createdBy":{"type":"string"}},"required":["id","keyPrefix","name","scopes","isActive","expiresAt","createdAt","createdBy"]}}},"required":["success","data"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}}}},"post":{"operationId":"createApiKey","summary":"Create an API key","tags":["API Keys"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"Display name for this key"},"scopes":{"type":"array","items":{"type":"string"},"description":"Scopes to grant (e.g. [\"banks:read\", \"feeds:read\"])"},"expiresInDays":{"type":"integer","minimum":0,"exclusiveMinimum":true,"description":"Days until expiry; omit for no expiry"},"cdrAcknowledged":{"type":"boolean","description":"Required for workspaces with CDR (Australian) banks: the customer acknowledges CDR data may be read into their own systems via this key."},"cdrWordingVersion":{"type":"string","description":"Disclosure wording version acknowledged (paired with cdrAcknowledged)."}},"required":["name","scopes"]}}}},"responses":{"201":{"description":"API key created. The plaintext key is shown once — store it immediately.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"apiKey":{"type":"string","description":"Plaintext key — shown only once"},"keyId":{"type":"string"},"expiresAt":{"type":"string","nullable":true}},"required":["success","apiKey","keyId","expiresAt"]}}}},"400":{"description":"Invalid scopes","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"403":{"description":"Forbidden (Admin+ required)","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}}}}},"/v1/api-keys/{kid}":{"delete":{"operationId":"revokeApiKey","summary":"Revoke an API key","tags":["API Keys"],"security":[{"bearerAuth":[]}],"parameters":[{"schema":{"type":"string","description":"Key ID to revoke"},"required":true,"description":"Key ID to revoke","name":"kid","in":"path"}],"responses":{"200":{"description":"API key revoked","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]}},"required":["success"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"403":{"description":"Forbidden (Admin+ required)","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"string"},"code":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"message":{"type":"string"}},"required":["message"]}}},"required":["success","error"]}}}}}}}}}