Fee Reversals
Symitar in Platform
>
Fee Reversals
openapi: 3.0.1
info:
title: Symitar in Platform API - Fee Reversals
version: v1
description: API to interact with Symitar in Platform
contact:
name: Picard
url: https://www.jackhenry.com/
email: DC-Picard-Product@jackhenry.com
servers:
- url: https://platform.banno.com
description: Production Endpoint
components:
securitySchemes:
OpenIDEnterprise:
type: openIdConnect
openIdConnectUrl: https://login.jackhenry.com/.well-known/openid-configuration
description: "Jack Henry Enterprise Authentication. \n\n ### Supported Flows\n \n #### 1. Authorization Code Flow\n * **Use Case:** Person-at-keyboard logins (FI or JH Employees).\n * **Security:** Supports/recommends PKCE (S256). Supports Pushed Authorization Requests (PAR), and DPoP token binding.\n * **Client Auth:** Supports/recommends `client_assertion` (Private Key JWT), also supports `client_secret`.\n \n #### 2. Client Credentials Flow\n * **Use Case:** System services and machine-to-machine integrations.\n * **Security:** Supports DPoP token binding.\n * **Client Auth:** **Requires** `client_assertion` (Private Key JWT).\n"
OpenIDConsumer:
type: openIdConnect
openIdConnectUrl: https://digital.garden-fi.com/.well-known/openid-configuration
description: "Jack Henry Consumer Authentication. \n\n> **WARNING: FI-SPECIFIC ROUTING**\n> The authorization server is currently pointing to our **Sandbox Environment** (`digital.garden-fi.com`) so you can test this documentation. In production code, this domain **must** be replaced with the specific Financial Institution's domain.\n> Example: Replace `{API-ENVIRONMENT}` in `https://{API-ENVIRONMENT}/.well-known/openid-configuration` with `digital.garden-fi.com` for the Garden financial institution.\n\n### Supported Flows\n\n#### 1. Authorization Code Flow\n* **Use Case:** Person-at-keyboard logins (customer or member of FI).\n* **Security:** Supports/recommends PKCE (S256). Supports Pushed Authorization Requests (PAR), and DPoP token binding.\n* **Client Auth:** Supports `client_secret`.\n"
tags:
- name: Fee Reversals
description: Fee reversal and reversal-side counter update operations
paths:
/a/api/picard/v1/{InstitutionUniversalId}/fee-reversals:
post:
operationId: reverseFee
tags:
- Fee Reversals
summary: Reverse a Fee
description: |
Reverse (credit back) a previously charged fee by looking up the
original transaction using `postDate` + `sequenceNumber` within the
caller-provided account and share/loan scope.
Workflow:
1. Resolve original transaction details (sub-source, amount, date, branch) from the specified account + share/loan scope.
2. Reject duplicate reversals if this original transaction was already reversed.
3. Attempt GL-to-GL posting from institution clearing GL to mapped fee GL. Fails fast before crediting the member.
4. Post member-side reversal using SymX `deposit` (shares) or `loanAddon` (loans) in the Transactions service.
5. Persist reversal linkage in Spanner using the transaction locator key.
6. Create a note on the share/loan scope.
7. Best-effort decrement fee counters on the target record.
parameters:
- name: InstitutionUniversalId
in: path
description: A unique identifier to establish the identity of an Institution/Environment/Brand combination
required: true
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
type: object
description: Request body for `POST /fee-reversals`.
required:
- accountNumber
- postDate
- sequenceNumber
anyOf:
- required:
- shareId
- required:
- loanId
properties:
accountNumber:
type: string
description: 10-digit account number that owns the target share or loan
example: 0000379758
shareId:
type: string
description: Share ID. Mutually exclusive with loanId.
nullable: true
example: '0000'
loanId:
type: string
description: Loan ID. Mutually exclusive with shareId.
nullable: true
example: '0001'
postDate:
type: string
description: |
Post date (`YYYY-MM-DD`) of the original fee transaction to reverse.
Use the `postDate` value from the `transactions-search` endpoint.
example: '2026-03-19'
sequenceNumber:
type: integer
format: int64
description: |
Sequence number of the original fee transaction to reverse.
Use the `sequenceNumber` value from the `transactions-search` endpoint.
example: 42
responses:
'200':
description: Fee reversal successfully processed
content:
application/json:
schema:
type: object
description: |
Response from fee reversal operation.
A successful response confirms the member-side reversal posted.
Note creation and counter updates are best-effort follow-up operations
and are logged on failure.
properties:
status:
type: string
description: Status of the reversal
enum:
- success
- failed
example: success
message:
type: string
description: Status message
nullable: true
glTransactionId:
type: string
description: Deterministic reversal identifier in `{postDate}/{sequenceNumber}` format.
nullable: true
example: 2026-03-19/42
effectiveDate:
type: string
description: Server-derived effective date used for reversal posting
nullable: true
example: '2026-03-19'
'400':
description: Bad request — validation error
content:
application/problem+json:
schema:
type: object
required:
- type
- title
- details
properties:
type:
description: A string path which uniquely classifies the domain of the error.
type: string
nullable: false
example: jackhenry/operation-failed
title:
description: A end-user readable string title of the error type.
nullable: false
type: string
details:
description: An array of end-user readable strings which provide additional details for the error message.
type: array
nullable: false
items:
type: string
data:
type: object
description: |
Additional data that could be useful to a developer or for handing the error programmatically. The schema for the data in this object is intentionally left undefined.
nullable: true
'401':
description: Although the HTTP standard specifies "unauthorized", semantically this response means "unauthenticated". That is, the client must authenticate itself to get the requested response.
'403':
description: The client does not have access rights to the content; that is, it is unauthorized, so the server is refusing to give the requested resource. Unlike 401, the clients identity is known to the server.
'500':
description: An unexpected internal server error occurred while processing the request.
content:
application/problem+json:
schema:
type: object
required:
- type
- title
- details
properties:
type:
description: A string path which uniquely classifies the domain of the error.
type: string
nullable: false
example: jackhenry/operation-failed
title:
description: A end-user readable string title of the error type.
nullable: false
type: string
details:
description: An array of end-user readable strings which provide additional details for the error message.
type: array
nullable: false
items:
type: string
data:
type: object
description: |
Additional data that could be useful to a developer or for handing the error programmatically. The schema for the data in this object is intentionally left undefined.
nullable: true
examples:
internalServerError:
summary: Internal server error
value:
type: general/internal-server-error
title: Internal server error
details:
- Unexpected internal server error
Did this page help you?
Why was this page helpful?
Why wasn't this page helpful?
Thank you for your feedback!
Last updated Tue Sep 15 2026