{"id":22943962,"url":"https://github.com/moov-io/achgateway","last_synced_at":"2025-12-13T02:53:50.348Z","repository":{"id":37078948,"uuid":"363199453","full_name":"moov-io/achgateway","owner":"moov-io","description":"Payment gateway enabling automated ACH operations in a distributed and fault tolerant way.","archived":false,"fork":false,"pushed_at":"2025-03-28T18:45:38.000Z","size":2176,"stargazers_count":65,"open_issues_count":25,"forks_count":23,"subscribers_count":9,"default_branch":"master","last_synced_at":"2025-03-30T11:07:22.471Z","etag":null,"topics":["ach","ach-origination","ach-payments","fintech","hacktoberfest","nacha","payment-gateway","payments"],"latest_commit_sha":null,"homepage":"https://moov-io.github.io/achgateway/","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/moov-io.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-04-30T16:32:37.000Z","updated_at":"2025-03-25T14:53:10.000Z","dependencies_parsed_at":"2023-02-18T08:16:06.371Z","dependency_job_id":"e1ae0613-5883-4d00-b098-982e486d759f","html_url":"https://github.com/moov-io/achgateway","commit_stats":{"total_commits":694,"total_committers":15,"mean_commits":"46.266666666666666","dds":0.0749279538904899,"last_synced_commit":"c3d677ae292648d552bf050e4760ba1d450b59b7"},"previous_names":[],"tags_count":129,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moov-io%2Fachgateway","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moov-io%2Fachgateway/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moov-io%2Fachgateway/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moov-io%2Fachgateway/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/moov-io","download_url":"https://codeload.github.com/moov-io/achgateway/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247478323,"owners_count":20945266,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ach","ach-origination","ach-payments","fintech","hacktoberfest","nacha","payment-gateway","payments"],"created_at":"2024-12-14T14:14:58.291Z","updated_at":"2025-12-13T02:53:50.278Z","avatar_url":"https://github.com/moov-io.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!--generated-from:11badeae7f5171e6ec312a610718a7a4ac276e18df06d4d715e771702f50aba8 DO NOT REMOVE, DO UPDATE --\u003e\n[![Moov Banner Logo](https://user-images.githubusercontent.com/20115216/104214617-885b3c80-53ec-11eb-8ce0-9fc745fb5bfc.png)](https://github.com/moov-io)\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://moov-io.github.io/achgateway/\"\u003eProject Documentation\u003c/a\u003e\n  ·\n  \u003ca href=\"https://moov.io/blog/education/ach-gateway-guide/\"\u003eQuickstart Guide\u003c/a\u003e\n  ·\n  \u003ca href=\"https://slack.moov.io/\"\u003eCommunity\u003c/a\u003e\n  ·\n  \u003ca href=\"https://moov.io/blog/\"\u003eBlog\u003c/a\u003e\n  \u003cbr\u003e\n  \u003cbr\u003e\n\u003c/p\u003e\n\n[![GoDoc](https://godoc.org/github.com/moov-io/achgateway?status.svg)](https://godoc.org/github.com/moov-io/achgateway)\n[![Build Status](https://github.com/moov-io/achgateway/workflows/Go/badge.svg)](https://github.com/moov-io/achgateway/actions)\n[![Coverage Status](https://codecov.io/gh/moov-io/achgateway/branch/master/graph/badge.svg)](https://codecov.io/gh/moov-io/achgateway)\n[![Go Report Card](https://goreportcard.com/badge/github.com/moov-io/achgateway)](https://goreportcard.com/report/github.com/moov-io/achgateway)\n[![Apache 2 licensed](https://img.shields.io/badge/license-Apache2-blue.svg)](https://raw.githubusercontent.com/moov-io/achgateway/master/LICENSE)\n\n# moov-io/achgateway\n\nAn extensible, highly-available, distributed, and fault-tolerant ACH uploader and downloader. ACH Gateway creates events for outside services and transforms files prior to upload to fit real-world requirements of production systems.\n\nIf you believe you have identified a security vulnerability please responsibly report the issue as via email to security@moov.io. Please do not post it to a public issue tracker.\n\n## Getting started\n\nRead through the [project docs](https://moov-io.github.io/achgateway/) to gain an understanding of this project's purpose and how to run it.\n\nWe publish a [public Docker image `moov/achgateway`](https://hub.docker.com/r/moov/achgateway/) from Docker Hub or use this repository. No configuration is required to serve on `:8484` and metrics at `:9494/metrics` in Prometheus format.\n\nStart achgateway and an FTP server:\n```\n# Inside of ./examples/getting-started/\n$ docker compose up achgateway\n...\nachgateway_1  | ts=2021-06-18T23:38:06Z msg=\"public listening on :8484\" version=v0.4.1 level=info app=achgateway\nachgateway_1  | ts=2021-06-18T23:38:06Z msg=\"listening on [::]:9494\" version=v0.4.1 level=info app=achgateway\n```\n\nSubmit a file to achgateway (Nacha ACH format):\n```\n$ curl -XPOST \"http://localhost:8484/shards/foo/files/f6\" --data @./testdata/ppd-debit.ach\n...\nachgateway_1  | ts=2021-06-18T23:38:16Z msg=\"begin handle received ACHFile=f6 of 1918 bytes\" level=info app=achgateway version=v0.4.1\nachgateway_1  | ts=2021-06-18T23:38:16Z msg=\"finished handling ACHFile=f6\" level=info app=achgateway version=v0.4.1\n```\n\nSubmit a file to achgateway (moov-io ACH JSON format):\n```\n$ curl -XPOST \"http://localhost:8484/shards/foo/files/f4\" --data @./testdata/ppd-valid.json\n...\nachgateway_1  | ts=2021-06-18T23:38:16Z msg=\"begin handle received ACHFile=f4 of 1918 bytes\" level=info app=achgateway version=v0.4.1\nachgateway_1  | ts=2021-06-18T23:38:16Z msg=\"finished handling ACHFile=f4\" level=info app=achgateway version=v0.4.1\n```\n\nInitiate cutoff time processing (aka upload to your ODFI):\n```\n$ curl -XPUT \"http://localhost:9494/trigger-cutoff\" --data '{\"shardNames\":[\"testing\"]}'\nachgateway_1  | ts=2021-06-18T23:38:20Z msg=\"starting manual cutoff window processing\" level=info app=achgateway version=v0.4.1\nachgateway_1  | ts=2021-06-18T23:38:20Z msg=\"processing mergable directory foo\" level=info app=achgateway version=v0.4.1 shardKey=foo\nachgateway_1  | ts=2021-06-18T23:38:20Z msg=\"found *upload.FTPTransferAgent agent\" version=v0.4.1 shardKey=foo level=info app=achgateway\nachgateway_1  | ts=2021-06-18T23:38:20Z msg=\"found 1 matching ACH files: []string{\\\"storage-1/20210618-233820/foo/f4.ach\\\"}\" tenantID=foo level=info app=achgateway version=v0.4.1\nachgateway_1  | ts=2021-06-18T23:38:20Z msg=\"merged 1 files into 1 files\" level=info app=achgateway version=v0.4.1 tenantID=foo\n```\n\nView the uploaded file with [`achcli` from moov-io/ach](https://github.com/moov-io/ach#command-line):\n```\n$ achcli ./testdata/ftp-server/outbound/20210618-233820-231380104.ach\nDescribing ACH file './testdata/ftp-server/outbound/20210618-233820-231380104.ach'\n\n  Origin     OriginName   Destination  DestinationName  FileCreationDate  FileCreationTime\n  121042882  Wells Fargo  231380104    Citadel          181008            0101\n\n  BatchNumber  SECCode  ServiceClassCode                CompanyName  DiscretionaryData  Identification  EntryDescription  DescriptiveDate\n  1            PPD      200 (Mixed Debits and Credits)  Wells Fargo                     121042882       Trans. Des\n\n    TransactionCode       RDFIIdentification  AccountNumber      Amount  Name                    TraceNumber      Category\n    22 (Checking Credit)  23138010            81967038518        100000  Steven Tander           121042880000001\n\n    TransactionCode      RDFIIdentification  AccountNumber      Amount  Name                    TraceNumber      Category\n    27 (Checking Debit)  12104288            17124411           100000  My ODFI                 121042880000002\n\n  ServiceClassCode                EntryAddendaCount  EntryHash  TotalDebits  TotalCredits  MACCode  ODFIIdentification  BatchNumber\n  200 (Mixed Debits and Credits)  2                  35242298   100000       100000                 12104288            1\n\n  BatchCount  BlockCount  EntryAddendaCount  TotalDebitAmount  TotalCreditAmount\n  1           1           2                  100000            100000\n```\n\nInitiate inbound file processing:\n```\n$ curl -XPUT \"http://localhost:9494/trigger-inbound\"\nachgateway_1  | ts=2021-06-18T23:39:06Z msg=\"starting odfi periodic processing for testing\" level=info app=achgateway version=v0.4.1\nachgateway_1  | ts=2021-06-18T23:39:06Z msg=\"start retrieving and processing of inbound files in ftp:2121\" level=info app=achgateway version=v0.4.1\nachgateway_1  | ts=2021-06-18T23:39:06Z msg=\"created directory storage-1/download318650464\" level=info app=achgateway version=v0.4.1\nachgateway_1  | ts=2021-06-18T23:39:06Z msg=\"*upload.FTPTransferAgent found 1 inbound files in /returned/\" app=achgateway version=v0.4.1 level=info\nachgateway_1  | ts=2021-06-18T23:39:06Z msg=\"saved return-WEB.ach at storage-1/download318650464/returned/return-WEB.ach\" level=info app=achgateway version=v0.4.1\nachgateway_1  | ts=2021-06-18T23:39:06Z msg=\"*upload.FTPTransferAgent found 1 reconciliation files in /reconciliation/\" level=info app=achgateway version=v0.4.1\nachgateway_1  | ts=2021-06-18T23:39:06Z msg=\"saved ppd-debit.ach at storage-1/download318650464/reconciliation/ppd-debit.ach\" level=info app=achgateway version=v0.4.1\nachgateway_1  | ts=2021-06-18T23:39:06Z msg=\"*upload.FTPTransferAgent found 1 return files in /returned/\" level=info app=achgateway version=v0.4.1\nachgateway_1  | ts=2021-06-18T23:39:06Z msg=\"saved return-WEB.ach at storage-1/download318650464/returned/return-WEB.ach\" level=info app=achgateway version=v0.4.1\nachgateway_1  | ts=2021-06-18T23:39:06Z msg=\"odfi: processing return file\" app=achgateway version=v0.4.1 origin=691000134 destination=091400606 level=info\nachgateway_1  | ts=2021-06-18T23:39:06Z msg=\"odfi: return batch 0 entry 0 code R01\" app=achgateway origin=691000134 destination=091400606 version=v0.4.1 level=info\nachgateway_1  | ts=2021-06-18T23:39:06Z msg=\"odfi: return batch 1 entry 0 code R03\" version=v0.4.1 level=info app=achgateway origin=691000134 destination=091400606\nachgateway_1  | ts=2021-06-18T23:39:06Z msg=\"cleanup: deleted remote file /returned/return-WEB.ach\" version=v0.4.1 level=info app=achgateway\nachgateway_1  | ts=2021-06-18T23:39:06Z msg=\"cleanup: deleted remote file /reconciliation/ppd-debit.ach\" level=info app=achgateway version=v0.4.1\nachgateway_1  | ts=2021-06-18T23:39:06Z msg=\"cleanup: deleted remote file /returned/return-WEB.ach\" level=info app=achgateway version=v0.4.1\nachgateway_1  | ts=2021-06-18T23:39:06Z msg=\"finished odfi periodic processing for testing\" app=achgateway version=v0.4.1 level=info\n```\n\n## Usage\n\nachgateway accepts files over HTTP and Kafka to queue them up for upload at a Nacha cutoff time. This allows systems and humans to publish files and have them be optimized for upload. achgateway is inspired by [the work done in moov-io/paygate](https://github.com/moov-io/paygate) and is used in production at Moov.\n\n## Project status\n\nThis project is used in production at multiple companies and has reached a stable status. We are looking to improve the configuration of ACHGateway and looking for feedback from real-world usage. Please reach out and share your story.\n\n## Getting help\n\n channel | info\n ------- | -------\n[Project Documentation](https://moov-io.github.io/achgateway/) | Our project documentation available online.\nTwitter [@moov](https://twitter.com/moov)\t| You can follow Moov.io's Twitter feed to get updates on our project(s). You can also tweet us questions or just share blogs or stories.\n[GitHub Issue](https://github.com/moov-io/achgateway/issues) | If you are able to reproduce a problem please open a GitHub Issue under the specific project that caused the error.\n[moov-io slack](https://slack.moov.io/) | Join our slack channel (`#ach`) to have an interactive discussion about the development of the project.\n\n## Supported and tested platforms\n\n- 64-bit Linux (Ubuntu, Debian), macOS, and Windows\n\n## Contributing\n\nYes please! Please review our [Contributing guide](CONTRIBUTING.md) and [Code of Conduct](https://github.com/moov-io/ach/blob/master/CODE_OF_CONDUCT.md) to get started! Checkout our [issues for first time contributors](https://github.com/moov-io/achgateway/contribute) for something to help out with.\n\nThis project uses [Go Modules](https://github.com/golang/go/wiki/Modules) and uses Go 1.19 or higher. See [Golang's install instructions](https://golang.org/doc/install) for help setting up Go. You can download the source code and we offer [tagged and released versions](https://github.com/moov-io/achgateway/releases/latest) as well. We highly recommend you use a tagged release for production.\n\n### Test coverage\n\nImproving test coverage is a great candidate for new contributors and allows the project to move more quickly by reducing regression issues that might not be caught before a release is pushed out to our users. One great way to improve coverage is by adding edge cases and different inputs to functions (or [contributing and running fuzzers](https://github.com/dvyukov/go-fuzz)).\n\nTests can run processes (like SQLite databases), but should only do so locally.\n\n## License\n\nApache License 2.0 - See [LICENSE](LICENSE) for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmoov-io%2Fachgateway","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmoov-io%2Fachgateway","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmoov-io%2Fachgateway/lists"}