Skip to content

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
  1. Overview
  2. Authentication
  3. Limits
  4. Endpoints
  5. Request format
  6. Errors
  7. Examples
  8. How values are written
  9. NACHA format overview

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

NACHA files must adhere to strict formatting rules to be accepted by financial institutions. This API checks your data against those rules before it writes a file, and tells you exactly what to fix when something doesn’t pass.
Endpoints
EndpointWhat it doesSuccess response
POST /api/v1/nacha/generateValidates the request and writes the fileThe file: text/plain, attachment nacha_file.txt
POST /api/v1/nacha/validateRuns the same checks without writing a fileJSON: {"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.

How an old API key is treated
MethodExampleNow
HTTP headerX-API-Key: your_api_key_hereAccepted and ignored
Query parameter/api/v1/nacha/generate?api_key=your_api_key_hereAccepted 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

Request limits
LimitValueWhen you exceed it
RateAbout 30 requests a minute per IP address429 with Retry-After: 60
Body size1 MB of JSON (several thousand entries)413
Content typeapplication/json (charset allowed)415
BrowsersNo CORS headers: call the API from a server or a script, not from a web page on another siteThe browser blocks the response

Endpoints

Both endpoints take the same request body and run the same checks, in this order:

  1. The body must be JSON (415 otherwise) and parse (400 otherwise).
  2. Structure: every required key present, no unknown keys, every value a string of the right shape (400 Invalid input data).
  3. NACHA rules: required values filled in, codes from their lists, dates real, numbering and totals that fit their fields (400 NACHA validation failed).
  4. 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:

400 · structure error (formatted)
{
  "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:

400 · NACHA rule error (formatted)
{
  "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.

200 · valid
{
  "message": "NACHA data validation successful",
  "valid": true
}
200 · valid, with a warning
{
  "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.
Request body: the shape
{
  "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.

File header fields
FieldRequiredDescriptionFormat and defaultPositions
immediate_destinationImmediate destinationYesRouting number of the ACH Operator or receiving point9 digits, can have a leading space4–13
immediate_originImmediate originYesRouting number or other identifier of the originating institution9 digits, can have a leading space; or a 10-character identifier agreed with your ODFI14–23
file_creation_dateFile creation dateNoDate the file was createdYYMMDD format (defaults to current date, America/New_York)24–29
file_creation_timeFile creation timeNoTime the file was createdHHMM format, 24-hour (defaults to current time, America/New_York)30–33
file_id_modifierFile ID modifierNoDistinguishes between multiple files created on same dateA-Z, 0-9 (defaults to 'A')34
record_sizeRecord sizeNoSize of each record094 (default; no other value is valid)35–37
blocking_factorBlocking factorNoNumber of records in a block10 (default; no other value is valid)38–39
format_codeFormat codeNoFormat code1 (default)40
immediate_destination_nameImmediate destination nameNoName of the destination institutionUp to 23 characters41–63
immediate_origin_nameImmediate origin nameNoName of the originating institutionUp to 23 characters64–86
reference_codeReference codeNoReference code for the fileUp to 8 characters87–94
priority_codePriority codeNoPriority of the file2 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.

Batch header fields
FieldRequiredDescriptionFormat and defaultPositions
service_class_codeService class codeYesCode indicating the type of entries in the batch200 (mixed debits and credits), 220 (credits only) or 225 (debits only)2–4
company_nameCompany nameYesName of the company/organizationUp to 16 characters5–20
company_discretionary_dataCompany discretionary dataNoFor discretionary useUp to 20 characters21–40
company_idCompany IDYesCompany identification numberUp to 10 characters41–50
standard_entry_classStandard entry class (SEC)YesCode identifying the type of entriesPPD, CCD, CTX, WEB, TEL, ARC, BOC or POP51–53
company_entry_descriptionCompany entry descriptionYesDescription of the entriesUp to 10 characters54–63
company_descriptive_dateCompany descriptive dateNoDescriptive date for the companyYYMMDD format (defaults to current date)64–69
effective_entry_dateEffective entry dateNoDate the entries should be settledYYMMDD format (defaults to the next banking day: weekdays except Federal Reserve holidays)70–75
settlement_dateSettlement dateNoSettlement date filled by ACH Operator3 characters (leave it out; defaults to blanks)76–78
originator_status_codeOriginator status codeNoCode identifying the status of the originator1 (default) or 279
originating_dfi_idOriginating DFI IDYesRouting number of the originating institution9 digits (the first 8 are written; the 9th is the check digit)80–87
batch_numberBatch numberNoBatch sequence numberUp 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.

Entry detail fields
FieldRequiredDescriptionFormat and defaultPositions
transaction_codeTransaction codeYesCode identifying the type of transaction22 (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 IDYesRouting number of the receiving institution (including check digit)9 digits (complete routing number)4–12
dfi_account_numberAccount numberYesAccount number at the receiving institutionUp to 17 characters13–29
amountAmount (cents)YesAmount of the transaction in centsUp to 10 digits (e.g., 100000 = $1,000.00); 0 for prenotes30–39
individual_idIndividual IDNoIdentification number for the individualUp 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 nameYesName of the individualUp to 22 characters (CTX: up to 16, written at positions 59-74)55–76
discretionary_dataDiscretionary dataNoFor discretionary useUp to 2 characters (WEB/TEL debits: the payment type code R, S or ST)77–78
trace_numberTrace numberNoUnique identifier for the transactionUp 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.

Addenda fields
FieldRequiredDescriptionFormat and defaultPositions
addenda_type_codeAddenda type codeNoType of addenda record05 (default)2–3
payment_related_infoPayment related informationYesAdditional information about the paymentUp to 80 characters4–83
addenda_sequence_numberAddenda sequence numberNoSequence number for multiple addenda recordsUp to 4 digits (defaults to the record's position: 1, 2, 3 and so on)84–87

Errors

Status codes

Status codes
StatusWhenBody
200Successgenerate: the file (text/plain). validate: {"message", "valid": true} plus "warnings" when there are any.
400The body is not valid JSON{"error": "Bad request", "message": "Failed to decode JSON object"}
400The JSON has the wrong shape: a missing, unknown or mistyped field{"details": {…}, "error": "Invalid input data"} (validate: "Invalid input data structure")
400The fields break a NACHA rule{"details": ["…"], "error": "NACHA validation failed"}
404Unknown path under /api, or a retired /admin/api-keys endpoint{"error": "Not found", …}
405Any method other than POST{"error": "Method not allowed", "message": "The method is not allowed for the requested URL."} with Allow: POST
413The body is larger than 1 MB{"error": "Payload too large", "message": "The request body must be 1 MB or less."}
415Content-Type is not application/json{"error": "Request must be JSON"}
429More than about 30 requests a minute from one address{"error": "Rate limit exceeded"} with Retry-After: 60
500An 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:

Structure error messages
MessageCause
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: 123456780000001Two 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.

NACHA rule messages
MessageMeaning
Missing required field: <field>A required value is empty.
<field>: Value must contain only digitsDigits only.
<field>: Date must be in YYMMDD formatSix digits, YYMMDD.
<field>: Time must be in HHMM formatFour digits, HHMM.
<field> must be 2 digitsExactly this many digits (priority_code, record_size, blocking_factor).
<field> must be at most 23 charactersLonger than the field.
<field> must be at most 7 digitsMore 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 characterOne 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, POPThe 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, 38Checking 22/23/27/28, savings 32/33/37/38.
addenda_type_code must be '05' for standard addenda recordsOnly 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:

Added NACHA rule messages
MessageMeaning
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-9Lowercase 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 blankAll spaces where a value is required.
<field> must not be blank for PPD entriesThe 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 entriesARC 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 entriesPOP entries pack three values into individual_id.
addenda must contain at most 9999 recordsThe addenda sequence number has four digits.
batch_number cannot be assigned automatically after batch number 9999999No room left to number batches automatically.
trace_number cannot be assigned automatically: the 7-digit trace sequence is exhaustedNo room left to number entries automatically.
addenda_sequence_number cannot be assigned automatically after 9999No 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 fieldA 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 fieldA 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.

Warning codes
CodeSeverityMeaning
aba-check-digitwarningA routing number’s ninth digit doesn’t match the ABA check-digit calculation.
routing-prefixwarningA routing number doesn’t start with an assigned routing symbol (00–12, 21–32, 61–72, 80).
immediate-destination-formatwarningimmediate_destination isn’t a 9-digit routing number.
immediate-origin-formatwarningimmediate_origin is neither a routing number nor a 10-character identifier.
priority-codewarningpriority_code isn’t 01, the only value in use.
scc-mismatchwarningservice_class_code 220 (credits only) or 225 (debits only) doesn’t match the batch’s entries.
sec-transaction-codewarningA credit in a debit-only SEC code (TEL, ARC, BOC, POP).
prenote-amountwarningA prenote (23, 28, 33, 38) with an amount other than 0.
payment-type-codewarningA WEB or TEL debit without R, S or ST in discretionary_data.
trace-prefixwarningA supplied trace number doesn’t start with the ODFI’s first eight digits.
trace-orderwarningTrace numbers don’t ascend within a batch.
addenda-limitwarningMore addenda than the SEC code allows (one for PPD, CCD and WEB; none for TEL, ARC, BOC and POP).
addenda-sequencewarningAddenda sequence numbers aren’t 0001, 0002, 0003… in order.
effective-date-pastwarningeffective_entry_date is before today (Eastern Time).
effective-date-todayinfoeffective_entry_date is today: it settles today only if your bank gets it before its same-day deadline.
effective-date-non-banking-daywarningeffective_entry_date is a weekend or a Federal Reserve holiday.
company-descriptive-datewarningcompany_descriptive_date isn’t a real date.
settlement-datewarningsettlement_date is filled in; the ACH operator sets it.
lowercaseinfoText 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"
        }
      ]
    }
  ]
}'
Response · nacha_file.txt
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"
        }
      ]
    }
  ]
}'
Response · nacha_file.txt
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

HTTP
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

  1. Create a request and set the method to POST.
  2. Enter the URL https://nacha-navigator.com/api/v1/nacha/generate.
  3. Under Headers, add Content-Type: application/json. No API key is needed.
  4. Under Body, choose raw and JSON, and paste one of the examples.
  5. Click Send. The response is the file; use Save response → Save to a file to keep it.

How values are written

Defaults and automatic values
FieldWhen you leave it out
file_creation_date, file_creation_timeThe date and time of the request, Eastern Time (America/New_York).
effective_entry_dateThe next banking day after today: weekdays except Federal Reserve holidays.
company_descriptive_dateToday.
batch_numberThe previous batch’s number plus 1, starting at 1. Numbers you supply must ascend.
trace_numberThe ODFI’s first eight digits plus a seven-digit sequence, unique in the file, skipping numbers you supplied.
addenda_sequence_number1, 2, 3… for each entry’s addenda records.
priority_code, file_id_modifier, record_size, blocking_factor, format_code01, A, 094, 10 and 1.
originator_status_code, settlement_date, addenda_type_code1, 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: 200 for mixed debits and credits, 220 credits only, 225 debits 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, S or ST) in discretionary_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 (was 500); 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

NACHA files are typically validated by the receiving financial institution. Ensure that your data is accurate and follows the NACHA specifications, and test with your bank before you send live payments.