REST API documentation
NACHA File Generator API
Generate and validate NACHA ACH files over HTTP. Send JSON describing your batches and entries; get back a file that’s ready for your bank. Free, no API key.
Base URL https://nacha-navigator.com · JSON in, NACHA file out
On this page
Overview
The NACHA File Generator API generates compliant NACHA formatted files for ACH transactions. Send a JSON description of the file (a file header, batches and their entries) and get back the file, ready for your bank. The API handles the complexity of NACHA file formatting, including:
- Fixed-width field formatting
- Batch and file header/footer generation
- Control total calculations
- Hash sum calculations
- Record count tracking
- Block padding
Note
| Endpoint | What it does | Success response |
|---|---|---|
| POST /api/v1/nacha/generate | Validates the request and writes the file | The file: text/plain, attachment nacha_file.txt |
| POST /api/v1/nacha/validate | Runs the same checks without writing a file | JSON: {"message": …, "valid": true} |
Prefer a form? The NACHA Generator builds the same files in your browser and exports this exact JSON, so a file you design there can be produced by your systems later. The builder never calls the API: what you type there stays on your device.
Privacy. Requests are processed in memory. Request bodies and generated files are never stored or logged; the only record kept is an anonymous count of files generated, shown on the analytics page.
Authentication
None. The API used to require an API key; keys have been retired and the API is free to use. Clients that still send a key keep working: it is accepted and ignored.
| Method | Example | Now |
|---|---|---|
| HTTP header | X-API-Key: your_api_key_here | Accepted and ignored |
| Query parameter | /api/v1/nacha/generate?api_key=your_api_key_here | Accepted and ignored. Avoid it: query strings end up in logs. |
The key administration endpoints (GET and POST /admin/api-keys, POST /admin/api-keys/revoke) are retired and answer 404.
Limits
| Limit | Value | When you exceed it |
|---|---|---|
| Rate | About 30 requests a minute per IP address | 429 with Retry-After: 60 |
| Body size | 1 MB of JSON (several thousand entries) | 413 |
| Content type | application/json (charset allowed) | 415 |
| Browsers | No CORS headers: call the API from a server or a script, not from a web page on another site | The browser blocks the response |
Endpoints
Both endpoints take the same request body and run the same checks, in this order:
- The body must be JSON (
415otherwise) and parse (400otherwise). - Structure: every required key present, no unknown keys, every value a string of the right shape (
400 Invalid input data). - NACHA rules: required values filled in, codes from their lists, dates real, numbering and totals that fit their fields (
400 NACHA validation failed). - Warnings that don’t block the file, such as a routing number that fails its check digit: reported by
/validate.
Generate a NACHA file
POST/api/v1/nacha/generate
Send the request body (see Request format) with Content-Type: application/json. A valid request returns the file itself:
- Status
200,Content-Type: text/plain; charset=utf-8,Content-Disposition: attachment; filename=nacha_file.txt,Cache-Control: no-store. - 94-character records in uppercase ASCII, each ending with a line feed (LF), the last one included.
- Padded with records of nines to a multiple of ten records.
A request that fails a check returns JSON instead. Structure errors are keyed by field, with list positions as strings:
{
"details": {
"batches": {
"0": {
"entries": {
"0": {
"amount": [
"String does not match expected pattern."
]
}
}
}
},
"file_header": {
"immediate_origin": [
"Missing data for required field."
]
}
},
"error": "Invalid input data"
}Rule errors are a list of messages, each naming its batch, entry and field:
{
"details": [
"Batch 1: Missing required field: company_name"
],
"error": "NACHA validation failed"
}Validate NACHA data
POST/api/v1/nacha/validate
Checks a request without generating a file. Use it to test data before a payment run. The answer is JSON with a valid flag; errors carry the same details as /generate, with "valid": false and the structure error named Invalid input data structure.
{
"message": "NACHA data validation successful",
"valid": true
}{
"message": "NACHA data validation successful",
"valid": true,
"warnings": [
{
"code": "aba-check-digit",
"message": "Batch 1: Entry 1: receiving_dfi_id 021000022 fails the ABA routing number check digit test",
"path": "batches.0.entries.0.receiving_dfi_id",
"severity": "warning"
}
]
}warnings appears only when there is something to report. Each warning has a stable code (listed under Warnings), a severity (warning or info), the field’s path in the request and a message.
Request format
A JSON object with a file_header and at least one batch. Each batch has a batch_header and at least one entry; an entry may carry addenda records.
- Every value is a string, amounts and codes included:
"amount": "100000"is $1,000.00 (amounts are in cents). - Required keys must be present. Optional keys can be left out: their defaults apply.
- Unknown keys are rejected with
Unknown field., so a misspelled optional field never goes unnoticed. - Text is printable ASCII: letters, digits, spaces and punctuation. It is written in uppercase.
{
"file_header": {
"immediate_destination": "123456780",
"immediate_origin": "1234567890"
},
"batches": [
{
"batch_header": {
"service_class_code": "220",
"company_name": "COMPANY ABC",
"company_id": "1234567890",
"standard_entry_class": "PPD",
"company_entry_description": "PAYROLL",
"originating_dfi_id": "123456780"
},
"entries": [
{
"transaction_code": "22",
"receiving_dfi_id": "021000021",
"dfi_account_number": "123456789",
"amount": "100000",
"individual_name": "JOHN DOE",
"addenda": [
{ "payment_related_info": "PAY PERIOD 09/01-09/15" }
]
}
]
}
]
}File header
The file header record contains information about the origin and destination of the file.
| Field | Required | Description | Format and default | Positions |
|---|---|---|---|---|
immediate_destinationImmediate destination | Yes | Routing number of the ACH Operator or receiving point | 9 digits, can have a leading space | 4–13 |
immediate_originImmediate origin | Yes | Routing number or other identifier of the originating institution | 9 digits, can have a leading space; or a 10-character identifier agreed with your ODFI | 14–23 |
file_creation_dateFile creation date | No | Date the file was created | YYMMDD format (defaults to current date, America/New_York) | 24–29 |
file_creation_timeFile creation time | No | Time the file was created | HHMM format, 24-hour (defaults to current time, America/New_York) | 30–33 |
file_id_modifierFile ID modifier | No | Distinguishes between multiple files created on same date | A-Z, 0-9 (defaults to 'A') | 34 |
record_sizeRecord size | No | Size of each record | 094 (default; no other value is valid) | 35–37 |
blocking_factorBlocking factor | No | Number of records in a block | 10 (default; no other value is valid) | 38–39 |
format_codeFormat code | No | Format code | 1 (default) | 40 |
immediate_destination_nameImmediate destination name | No | Name of the destination institution | Up to 23 characters | 41–63 |
immediate_origin_nameImmediate origin name | No | Name of the originating institution | Up to 23 characters | 64–86 |
reference_codeReference code | No | Reference code for the file | Up to 8 characters | 87–94 |
priority_codePriority code | No | Priority of the file | 2 digits (defaults to '01', the only value in use) | 2–3 |
Batch header
The batch header contains information about a group of related entries: who sends them, what they are and when they settle. The batch control record that closes each batch is calculated from it and from the entries.
| Field | Required | Description | Format and default | Positions |
|---|---|---|---|---|
service_class_codeService class code | Yes | Code indicating the type of entries in the batch | 200 (mixed debits and credits), 220 (credits only) or 225 (debits only) | 2–4 |
company_nameCompany name | Yes | Name of the company/organization | Up to 16 characters | 5–20 |
company_discretionary_dataCompany discretionary data | No | For discretionary use | Up to 20 characters | 21–40 |
company_idCompany ID | Yes | Company identification number | Up to 10 characters | 41–50 |
standard_entry_classStandard entry class (SEC) | Yes | Code identifying the type of entries | PPD, CCD, CTX, WEB, TEL, ARC, BOC or POP | 51–53 |
company_entry_descriptionCompany entry description | Yes | Description of the entries | Up to 10 characters | 54–63 |
company_descriptive_dateCompany descriptive date | No | Descriptive date for the company | YYMMDD format (defaults to current date) | 64–69 |
effective_entry_dateEffective entry date | No | Date the entries should be settled | YYMMDD format (defaults to the next banking day: weekdays except Federal Reserve holidays) | 70–75 |
settlement_dateSettlement date | No | Settlement date filled by ACH Operator | 3 characters (leave it out; defaults to blanks) | 76–78 |
originator_status_codeOriginator status code | No | Code identifying the status of the originator | 1 (default) or 2 | 79 |
originating_dfi_idOriginating DFI ID | Yes | Routing number of the originating institution | 9 digits (the first 8 are written; the 9th is the check digit) | 80–87 |
batch_numberBatch number | No | Batch sequence number | Up to 7 digits, ascending through the file (defaults to the previous batch number plus 1, starting at 1) | 88–94 |
Entry detail
Each entry detail record contains information about an individual transaction.
| Field | Required | Description | Format and default | Positions |
|---|---|---|---|---|
transaction_codeTransaction code | Yes | Code identifying the type of transaction | 22 (checking credit), 23 (checking credit prenote), 27 (checking debit), 28 (checking debit prenote), 32 (savings credit), 33 (savings credit prenote), 37 (savings debit) or 38 (savings debit prenote) | 2–3 |
receiving_dfi_idReceiving DFI ID | Yes | Routing number of the receiving institution (including check digit) | 9 digits (complete routing number) | 4–12 |
dfi_account_numberAccount number | Yes | Account number at the receiving institution | Up to 17 characters | 13–29 |
amountAmount (cents) | Yes | Amount of the transaction in cents | Up to 10 digits (e.g., 100000 = $1,000.00); 0 for prenotes | 30–39 |
individual_idIndividual ID | No | Identification number for the individual | Up to 15 characters (ARC/BOC: the check serial number; POP: check serial number in characters 1-9, terminal city 10-13, terminal state 14-15) | 40–54 |
individual_nameIndividual name | Yes | Name of the individual | Up to 22 characters (CTX: up to 16, written at positions 59-74) | 55–76 |
discretionary_dataDiscretionary data | No | For discretionary use | Up to 2 characters (WEB/TEL debits: the payment type code R, S or ST) | 77–78 |
trace_numberTrace number | No | Unique identifier for the transaction | Up to 15 digits, unique within the file (defaults to the ODFI routing prefix plus a 7-digit sequence number) | 80–94 |
addenda is an optional array of addenda records (below). Positions are those of the PPD and CCD layouts; CTX, POP and ARC/BOC differences are noted in the formats.
Addenda records
Addenda records contain additional information related to an entry detail record, such as an invoice number. PPD, CCD and WEB entries carry at most one; CTX entries up to 9,999; TEL, ARC, BOC and POP none.
| Field | Required | Description | Format and default | Positions |
|---|---|---|---|---|
addenda_type_codeAddenda type code | No | Type of addenda record | 05 (default) | 2–3 |
payment_related_infoPayment related information | Yes | Additional information about the payment | Up to 80 characters | 4–83 |
addenda_sequence_numberAddenda sequence number | No | Sequence number for multiple addenda records | Up to 4 digits (defaults to the record's position: 1, 2, 3 and so on) | 84–87 |
Errors
Status codes
| Status | When | Body |
|---|---|---|
| 200 | Success | generate: the file (text/plain). validate: {"message", "valid": true} plus "warnings" when there are any. |
| 400 | The body is not valid JSON | {"error": "Bad request", "message": "Failed to decode JSON object"} |
| 400 | The JSON has the wrong shape: a missing, unknown or mistyped field | {"details": {…}, "error": "Invalid input data"} (validate: "Invalid input data structure") |
| 400 | The fields break a NACHA rule | {"details": ["…"], "error": "NACHA validation failed"} |
| 404 | Unknown path under /api, or a retired /admin/api-keys endpoint | {"error": "Not found", …} |
| 405 | Any method other than POST | {"error": "Method not allowed", "message": "The method is not allowed for the requested URL."} with Allow: POST |
| 413 | The body is larger than 1 MB | {"error": "Payload too large", "message": "The request body must be 1 MB or less."} |
| 415 | Content-Type is not application/json | {"error": "Request must be JSON"} |
| 429 | More than about 30 requests a minute from one address | {"error": "Rate limit exceeded"} with Retry-After: 60 |
| 500 | An unexpected failure on our side (please report it) | {"error": "Internal server error"} |
JSON error bodies have their keys in alphabetical order. On /validate, the 400, 415 and 500 bodies also carry "valid": false.
Structure errors
Under details, each field with a problem lists its messages. These are the messages, word for word:
| Message | Cause |
|---|---|
| Missing data for required field. | A required key is absent. |
| Unknown field. | A key the API doesn’t know (check the spelling: names are snake_case). |
| Field may not be null. | A value is null. Leave optional keys out instead. |
| Not a valid string. | A value is a number or boolean. Every value is a string, amounts included ("100000"). |
| Not a valid list. | "batches", "entries" or "addenda" is not an array. |
| Invalid input type. | Something that should be an object isn’t (reported under "_schema"). |
| String does not match expected pattern. | A value doesn’t have the required digits, e.g. a routing number that isn’t 9 digits or a date that isn’t YYMMDD. |
| Longer than maximum length 16. | A value is longer than its field (the number is the limit). |
| Length must be 1. | A value must have exactly this many characters. |
| Shorter than minimum length 1. | "batches" or "entries" is empty. |
| Must be one of: 200, 220, 225. | A code outside its list (service class, SEC code, transaction code…). |
| Must contain only printable ASCII characters. | Text with accented letters, emoji, tabs or line breaks. Records carry printable ASCII only. |
| Duplicate trace number found: 123456780000001 | Two entries share a trace number (compared as 15 digits, so "1" equals "000000000000001"). |
NACHA rule errors
Each message is prefixed with where it applies: Batch 1: , Batch 1: Entry 2: or Batch 1: Entry 2, Addenda 1: (counted from 1). <field> stands for the field’s name.
| Message | Meaning |
|---|---|
| Missing required field: <field> | A required value is empty. |
| <field>: Value must contain only digits | Digits only. |
| <field>: Date must be in YYMMDD format | Six digits, YYMMDD. |
| <field>: Time must be in HHMM format | Four digits, HHMM. |
| <field> must be 2 digits | Exactly this many digits (priority_code, record_size, blocking_factor). |
| <field> must be at most 23 characters | Longer than the field. |
| <field> must be at most 7 digits | More digits than the field holds. |
| <field> must be 9 digits (including check digit) | Routing numbers are all nine digits, including the check digit. |
| file_id_modifier must be 1 character | One character. |
| format_code must be '1' | Always 1. |
| service_class_code must be '200', '220', or '225' | 200 mixed, 220 credits only, 225 debits only. |
| standard_entry_class must be one of: PPD, CCD, CTX, WEB, TEL, ARC, BOC, POP | The SEC codes the API writes. |
| originator_status_code must be '1' or '2' | 1 for almost every originator; 2 for federal government agencies. |
| transaction_code must be one of: 22, 23, 27, 28, 32, 33, 37, 38 | Checking 22/23/27/28, savings 32/33/37/38. |
| addenda_type_code must be '05' for standard addenda records | Only 05 addenda are written. |
Rules added in this version keep the same style. Each closes a gap that let the original API write a file a bank would reject:
| Message | Meaning |
|---|---|
| record_size must be '094' | The record size is fixed. |
| blocking_factor must be '10' | The blocking factor is fixed. |
| file_id_modifier must be a letter A-Z or a digit 0-9 | Lowercase is accepted and written in uppercase. |
| <field> must be a valid calendar date (YYMMDD) | A date that doesn’t exist, like 260231. |
| <field> must be a valid time of day (HHMM, 0000-2359) | A time that doesn’t exist, like 2460. |
| batch_number must be greater than the previous batch's batch number (0000003) | Batch numbers must ascend through the file. |
| <field> must not be blank | All spaces where a value is required. |
| <field> must not be blank for PPD entries | The receiver name is required for PPD, CCD, CTX, WEB and TEL entries. |
| individual_name must be at most 16 characters for CTX entries (Receiving Company Name/ID Number, positions 59-74) | CTX entries hold a shorter name. |
| individual_id must contain the check serial number for ARC entries | ARC and BOC entries carry the converted check’s serial number. |
| individual_id must contain the check serial number (characters 1-9), terminal city (10-13) and terminal state (14-15) for POP entries | POP entries pack three values into individual_id. |
| addenda must contain at most 9999 records | The addenda sequence number has four digits. |
| batch_number cannot be assigned automatically after batch number 9999999 | No room left to number batches automatically. |
| trace_number cannot be assigned automatically: the 7-digit trace sequence is exhausted | No room left to number entries automatically. |
| addenda_sequence_number cannot be assigned automatically after 9999 | No room left to number addenda automatically. |
| entry/addenda count 1000000 exceeds the 6-digit Batch Control field (999999) | Too many records in one batch for its control record. |
| total debit amount exceeds the 12-digit Batch Control field | A batch total beyond $9,999,999,999.99. |
| batch count 1000000 exceeds the 6-digit File Control field (999999) | Too many batches for the file control record. |
| entry/addenda count 100000000 exceeds the 8-digit File Control field (99999999) | Too many records for the file control record. |
| block count 1000000 exceeds the 6-digit File Control field (999999) | Too many blocks for the file control record. |
| total credit amount exceeds the 12-digit File Control field | A file total beyond $9,999,999,999.99. |
Warnings
Warnings never block a file: /generate writes it anyway, and /validate lists them so you can decide.
| Code | Severity | Meaning |
|---|---|---|
| aba-check-digit | warning | A routing number’s ninth digit doesn’t match the ABA check-digit calculation. |
| routing-prefix | warning | A routing number doesn’t start with an assigned routing symbol (00–12, 21–32, 61–72, 80). |
| immediate-destination-format | warning | immediate_destination isn’t a 9-digit routing number. |
| immediate-origin-format | warning | immediate_origin is neither a routing number nor a 10-character identifier. |
| priority-code | warning | priority_code isn’t 01, the only value in use. |
| scc-mismatch | warning | service_class_code 220 (credits only) or 225 (debits only) doesn’t match the batch’s entries. |
| sec-transaction-code | warning | A credit in a debit-only SEC code (TEL, ARC, BOC, POP). |
| prenote-amount | warning | A prenote (23, 28, 33, 38) with an amount other than 0. |
| payment-type-code | warning | A WEB or TEL debit without R, S or ST in discretionary_data. |
| trace-prefix | warning | A supplied trace number doesn’t start with the ODFI’s first eight digits. |
| trace-order | warning | Trace numbers don’t ascend within a batch. |
| addenda-limit | warning | More addenda than the SEC code allows (one for PPD, CCD and WEB; none for TEL, ARC, BOC and POP). |
| addenda-sequence | warning | Addenda sequence numbers aren’t 0001, 0002, 0003… in order. |
| effective-date-past | warning | effective_entry_date is before today (Eastern Time). |
| effective-date-today | info | effective_entry_date is today: it settles today only if your bank gets it before its same-day deadline. |
| effective-date-non-banking-day | warning | effective_entry_date is a weekend or a Federal Reserve holiday. |
| company-descriptive-date | warning | company_descriptive_date isn’t a real date. |
| settlement-date | warning | settlement_date is filled in; the ACH operator sets it. |
| lowercase | info | Text contains lowercase letters (written in uppercase). |
Examples
Copy-ready requests. The routing numbers pass the ABA check digit, so these validate without warnings. Replace them, and every name and account number, with your own.
Basic example
A file with one batch containing one entry: a $1,000.00 payroll credit.
curl https://nacha-navigator.com/api/v1/nacha/generate \
-H 'Content-Type: application/json' \
-o nacha_file.txt \
--data-raw '{
"file_header": {
"immediate_destination": "123456780",
"immediate_origin": "1234567890",
"immediate_destination_name": "DESTINATION BANK",
"immediate_origin_name": "ORIGIN COMPANY"
},
"batches": [
{
"batch_header": {
"service_class_code": "220",
"company_name": "COMPANY ABC",
"company_id": "1234567890",
"standard_entry_class": "PPD",
"company_entry_description": "PAYROLL",
"originating_dfi_id": "123456780"
},
"entries": [
{
"transaction_code": "22",
"receiving_dfi_id": "021000021",
"dfi_account_number": "123456789",
"amount": "100000",
"individual_id": "EMP123",
"individual_name": "JOHN DOE"
}
]
}
]
}'101 12345678012345678902603021015A094101DESTINATION BANK ORIGIN COMPANY
5220COMPANY ABC 1234567890PPDPAYROLL 260302260303 1123456780000001
622021000021123456789 0000100000EMP123 JOHN DOE 0123456780000001
822000000100021000020000000000000000001000001234567890 123456780000001
9000001000001000000010002100002000000000000000000100000
9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
Generated for a request sent Monday, March 2, 2026 at 10:15 ET: dates default to the time of your request.
Complex example
Multiple batches and entries, including an addenda record: a payroll batch of two credits, and a corporate batch with one debit.
curl https://nacha-navigator.com/api/v1/nacha/generate \
-H 'Content-Type: application/json' \
-o nacha_file.txt \
--data-raw '{
"file_header": {
"immediate_destination": "123456780",
"immediate_origin": "1234567890",
"file_id_modifier": "A",
"immediate_destination_name": "DESTINATION BANK",
"immediate_origin_name": "ORIGIN COMPANY",
"reference_code": "SEP2026"
},
"batches": [
{
"batch_header": {
"service_class_code": "220",
"company_name": "COMPANY ABC",
"company_id": "1234567890",
"standard_entry_class": "PPD",
"company_entry_description": "PAYROLL",
"originating_dfi_id": "123456780"
},
"entries": [
{
"transaction_code": "22",
"receiving_dfi_id": "021000021",
"dfi_account_number": "123456789",
"amount": "100000",
"individual_id": "EMP123",
"individual_name": "JOHN DOE",
"addenda": [
{
"payment_related_info": "EMPLOYEE ID 12345, PAY PERIOD 09/01/2026-09/15/2026"
}
]
},
{
"transaction_code": "32",
"receiving_dfi_id": "011000138",
"dfi_account_number": "987654321",
"amount": "150000",
"individual_id": "EMP456",
"individual_name": "JANE SMITH"
}
]
},
{
"batch_header": {
"service_class_code": "225",
"company_name": "COMPANY ABC",
"company_id": "1234567890",
"standard_entry_class": "CCD",
"company_entry_description": "INVOICE",
"originating_dfi_id": "123456780"
},
"entries": [
{
"transaction_code": "27",
"receiving_dfi_id": "121000248",
"dfi_account_number": "543210987",
"amount": "250000",
"individual_id": "INV-7731",
"individual_name": "ACME SUPPLIES"
}
]
}
]
}'101 12345678012345678902603021015A094101DESTINATION BANK ORIGIN COMPANY SEP2026
5220COMPANY ABC 1234567890PPDPAYROLL 260302260303 1123456780000001
622021000021123456789 0000100000EMP123 JOHN DOE 1123456780000001
705EMPLOYEE ID 12345, PAY PERIOD 09/01/2026-09/15/2026 00010000001
632011000138987654321 0000150000EMP456 JANE SMITH 0123456780000002
822000000300032000150000000000000000002500001234567890 123456780000001
5225COMPANY ABC 1234567890CCDINVOICE 260302260303 1123456780000002
627121000248543210987 0000250000INV-7731 ACME SUPPLIES 0123456780000003
822500000100121000240000002500000000000000001234567890 123456780000002
9000002000001000000040015300039000000250000000000250000
Generated for a request sent Monday, March 2, 2026 at 10:15 ET: dates default to the time of your request.
The raw request
POST /api/v1/nacha/generate HTTP/1.1
Host: nacha-navigator.com
Content-Type: application/json
{
"file_header": {
"immediate_destination": "123456780",
"immediate_origin": "1234567890",
"immediate_destination_name": "DESTINATION BANK",
"immediate_origin_name": "ORIGIN COMPANY"
},
"batches": [
{
"batch_header": {
"service_class_code": "220",
"company_name": "COMPANY ABC",
"company_id": "1234567890",
"standard_entry_class": "PPD",
"company_entry_description": "PAYROLL",
"originating_dfi_id": "123456780"
},
"entries": [
{
"transaction_code": "22",
"receiving_dfi_id": "021000021",
"dfi_account_number": "123456789",
"amount": "100000",
"individual_id": "EMP123",
"individual_name": "JOHN DOE"
}
]
}
]
}Using Postman
- Create a request and set the method to
POST. - Enter the URL
https://nacha-navigator.com/api/v1/nacha/generate. - Under Headers, add
Content-Type: application/json. No API key is needed. - Under Body, choose raw and JSON, and paste one of the examples.
- Click Send. The response is the file; use Save response → Save to a file to keep it.
How values are written
| Field | When you leave it out |
|---|---|
| file_creation_date, file_creation_time | The date and time of the request, Eastern Time (America/New_York). |
| effective_entry_date | The next banking day after today: weekdays except Federal Reserve holidays. |
| company_descriptive_date | Today. |
| batch_number | The previous batch’s number plus 1, starting at 1. Numbers you supply must ascend. |
| trace_number | The ODFI’s first eight digits plus a seven-digit sequence, unique in the file, skipping numbers you supplied. |
| addenda_sequence_number | 1, 2, 3… for each entry’s addenda records. |
| priority_code, file_id_modifier, record_size, blocking_factor, format_code | 01, A, 094, 10 and 1. |
| originator_status_code, settlement_date, addenda_type_code | 1, three blanks (the ACH operator fills it in) and 05. |
- Uppercase. Lowercase letters are written in uppercase. Accented letters are rejected rather than guessed at: convert “José” to “JOSE” before you send it.
- Immediate destination and origin. A 9-digit routing number is written with its leading blank (
" 123456780"); a 10-character value, such as a company identifier, is written as given. - Service class code is required:
200for mixed debits and credits,220credits only,225debits only. A mismatch with the entries is a warning. - Prenotes (transaction codes 23, 28, 33 and 38) carry an amount of
0. - SEC-specific layouts are written for you: CTX entries get the addenda count and a 16-character name; ARC and BOC take the check serial number in
individual_id; POP packs the serial number (9), terminal city (4) and state (2) into it; WEB and TEL debits carry the payment type (R,SorST) indiscretionary_data.
Changes from the original API
The request format and responses are unchanged. These fixes change the files it writes:
- The batch control record’s ODFI and batch number are at positions 80–94, where the specification puts them, and the batch number matches its batch header.
- Entry/addenda counts and the block count include addenda records.
- Files are padded to an exact multiple of ten records, matching the block count.
- A 10-character immediate destination or origin no longer shifts the rest of the file header.
- Missing trace numbers are assigned instead of written as zeros; addenda sequence numbers and batch numbers count up.
- Default dates come from the time of each request, not from when the server started.
- Line breaks and non-ASCII text are rejected, and totals or counts too large for their field are errors instead of being cut off.
- Malformed JSON is a
400(was500); unknown paths and wrong methods answer in JSON.
NACHA format overview
A NACHA file is plain text. Each record is exactly 94 characters long, and its first character says what kind of record it is:
- File Header (1): the destination, the origin and when the file was created.
- Batch Header (5): the company, the SEC code and the effective date of a group of entries.
- Entry Detail (6): one payment: routing and account number, amount and receiver.
- Addenda (7): optional extra information for an entry; CTX entries can have many.
- Batch Control (8): counts, totals and the entry hash of the batch. Generated for you.
- File Control (9): the same totals for the whole file. Generated for you.
Files are written in blocks of ten records; the last block is filled with records of nines. The NACHA file format reference describes every field of every record.
Important