DEV Community

Cover image for Parsing NDIS Support Item Numbers in 2026-27: Fields, Claim-Type Suffixes and Five Checks Before the Claim File
Rostery Team
Rostery Team

Posted on

Parsing NDIS Support Item Numbers in 2026-27: Fields, Claim-Type Suffixes and Five Checks Before the Claim File

Originally based on our article NDIS support item numbers explained: what every part of 01_011_0107_1_1 means on rostery.com.au. This version is rewritten for the people who set up price lists, build claim exports or look after the billing side of an NDIS provider's systems.

Every NDIS claim line carries a support item number, and most of the claiming problems we see start with that one field. The wrong time-of-day item, a travel line on a number that doesn't allow travel, an item the provider isn't registered for, a price copied from last year's list. None of these are hard to catch. They just need to be caught before the bulk upload rather than after the NDIA sends the file back.

This post treats the item number as data. We'll split it into its fields, look at what changed in the 2026-27 Support Catalogue, write a small Python sketch that picks the right time band, and finish with five checks to run on every line before you build the claim file.

General information only, not claiming or legal advice. The 2026-27 Pricing Schedule, the NDIS Support Catalogue and the NDIA's current guidance always come first.

Where the numbers come from

Three documents matter, and it helps to know which does what.

  • The NDIS Pricing Schedule 2026-27 sets the maximum amounts. Since 24 September 2026 it has the force of law through the NDIS (Pricing Arrangements) Determination 2026, and it lists 611 items with printed prices.
  • The NDIS Support Catalogue 2026-27 v1.1 is the spreadsheet you actually load. It has 976 current items and 41 legacy items, each with its unit, national, remote and very remote limits, start and end dates, and flags for which claim types are allowed.
  • The Pricing Arrangements and Price Limits 2025-26 v1.1 is still the NDIA's claiming guidance. The NDIA says it will publish updated pricing and claiming guidance documents shortly, so check for a newer version before you rely on any rule below.

If you're building anything, load the catalogue rather than copying prices from a PDF. You get dates and flags, not just dollars.

The fields

An item number such as 01_011_0107_1_1 splits on the underscore into five parts. Since 2026-27, many items also carry a sixth.

Table showing each part of an NDIS support item number: support category (2 digits, 01 to 15), sequence (usually 3 digits, 9 for many assistive technology items), registration group (4 digits), outcome domain (1 to 8), support purpose (1 Core, 2 Capital, 3 Capacity Building) and the claim-type suffix on therapy and professional items, with the rejection code linked to each check

A few things trip people up when they store these.

Keep it as text. The sequence and registration group have leading zeros (0107), and the sequence isn't a fixed width. In the 2026-27 catalogue, 270 items use a 9-digit sequence (mostly assistive technology) and 9 use 4 digits. A spreadsheet that turns 0107 into 107, or a column typed as a number, will quietly break matching. The NDIA's bulk upload guide allows up to 60 characters in the SupportNumber field, so don't truncate either.

The support purpose is the last base digit. In the current catalogue that's 243 Core items, 238 Capital and 494 Capacity Building. One further item, the bereavement support, has no number at all, so your loader needs to cope with a blank.

The category and the purpose don't always line up the way you'd expect. Fourteen therapy and early childhood items appear in category 01 (Assistance with Daily Life) with a purpose of 3 (Capacity Building). 01_665_0128_1_3 and 15_622_0128_1_3 are both speech pathology direct service at $193.99 an hour. They draw on different budgets, so matching on the description alone will pick the wrong one half the time.

Units vary. Of the 976 current items, 602 are claimed by the hour, 350 per item (each), 11 per year, 6 per week, 5 per day and 2 per month. Quantity validation has to follow the unit.

The claim-type suffix

This is the biggest structural change in 2026-27. Therapy and other professional items now have a separate number for each kind of claim:

Suffix Meaning Price
(none) Direct service the session price
_CA Short-notice cancellation same as the session
_NF Non-face-to-face work same as the session
_PT Provider travel half the session price
_RR NDIA requested reports same as the session
_TH Telehealth same as the session

There are 335 of these suffix items across 67 sets, including three _CA2 and _NF2 variants for two specific items. We checked every _PT item in the catalogue: each is exactly half its direct service price, so speech pathology travel is $97.00 an hour against a $193.99 session.

Items without a suffix, such as core daily-living supports, still use the older approach. The number stays the same and the bulk CSV's ClaimType column says what kind of claim it is: blank for direct service, or CANC, REPW, TRAN, NF2F, THLT or IRSS. Cancellations also need a CancellationReason code. Whether a claim type is allowed against a base item is in the catalogue's flag columns. If the claim type and the item don't agree, expect rejection C29, "This support item is not allowed for this claim type selection".

A sensible pattern is to validate the shape with one expression and then look the number up in the catalogue for everything else:

import re

ITEM = re.compile(
    r"^(?P<category>\d{2})_(?P<sequence>\d{3,9})_(?P<reg_group>\d{4})"
    r"_(?P<outcome>[1-8])_(?P<purpose>[1-3])"
    r"(?:_(?P<suffix>CA2|NF2|CA|NF|PT|RR|TH))?$"
)

def parse(number: str) -> dict:
    m = ITEM.match(number.strip())
    if not m:
        raise ValueError(f"not an item number: {number!r}")
    return m.groupdict()

parse("15_622_0128_1_3_PT")
# {'category': '15', 'sequence': '622', 'reg_group': '0128',
#  'outcome': '1', 'purpose': '3', 'suffix': 'PT'}
Enter fullscreen mode Exit fullscreen mode

The pattern only tells you the number is well formed. Whether it exists, what it costs and what it allows all come from the catalogue row.

Picking the time-of-day item

For daily-living supports, the day and time decide the number. Self-care has a weekday daytime item (01_011_0107_1_1, $73.58 an hour), evening (01_015, $81.07), night (01_002, $82.57), Saturday (01_013, $103.54), Sunday (01_014, $133.50), public holiday (01_012, $163.46) and a sleepover item (01_010, $311.79 each). Those are national limits.

Part 4 of the Pricing Schedule defines the bands. For supports other than nursing, weekday daytime starts at or after 6 am and ends at or before 8 pm; evening starts at or after 8 pm and finishes by midnight; night crosses midnight or starts before 6 am. Saturday, Sunday and public holiday supports run from midnight to midnight. Part 2 then adds the rule that matters most for code: where a support crosses times or days and one worker delivers all of it, the higher amount applies to the whole support.

That makes the logic simpler than it looks. Work out every band the shift touches and take the most expensive.

from datetime import datetime, time, timedelta

SELF_CARE = {  # national limits, Pricing Schedule 2026-27
    "01_011_0107_1_1": 73.58,   # weekday daytime
    "01_015_0107_1_1": 81.07,   # weekday evening
    "01_002_0107_1_1": 82.57,   # weekday night
    "01_013_0107_1_1": 103.54,  # Saturday
    "01_014_0107_1_1": 133.50,  # Sunday
    "01_012_0107_1_1": 163.46,  # public holiday
}

def band_at(t: datetime, holidays: set) -> str:
    if t.date() in holidays:
        return "01_012_0107_1_1"
    if t.weekday() == 5:
        return "01_013_0107_1_1"
    if t.weekday() == 6:
        return "01_014_0107_1_1"
    if t.time() < time(6):
        return "01_002_0107_1_1"
    if t.time() < time(20):
        return "01_011_0107_1_1"
    return "01_015_0107_1_1"

def item_for(start: datetime, end: datetime, holidays: set) -> str:
    """One worker, one continuous support, not a sleepover, not nursing."""
    touched, t = set(), start
    while t < end:
        touched.add(band_at(t, holidays))
        t += timedelta(minutes=15)
    return max(touched, key=SELF_CARE.get)
Enter fullscreen mode Exit fullscreen mode

A weekday shift from 6 pm to 10 pm touches daytime and evening, so the whole four hours go on the evening item. A shift from 10 pm Friday to 2 am Saturday touches evening and Saturday, so it's all Saturday. Three caveats before you lift this into production:

  • holidays has to hold the public holidays for the state or region where the support is delivered, not where your office is.
  • Sleepovers are a separate definition (eight hours or more across midnight, worker allowed to sleep) and a separate item. If more than two hours of active support happen overnight, the third and later hours are claimed at Saturday rates on weekdays.
  • Nursing uses different times. In 2026-27, nursing weekday daytime is 6 am to 6 pm.

If you want to sanity-check the output without writing anything, our free NDIS shift price calculator does the same job for a single shift: pick the support, day and times and it shows the band and the most you can claim.

Rostery's free NDIS shift price calculator showing a weekday 6 pm to 10 pm self-care shift landing on the Weekday Evening item, because the higher band applies to the whole shift

Location changes the price, not the number

The same number covers city and bush. What changes is which of the three limits applies, and that depends on where the support is delivered, not the participant's home address. MM 1 to 5 locations use the national limit, MM 6 the remote limit and MM 7 the very remote limit, which are generally 40% and 50% higher. Part 3 of the Pricing Schedule also reclassifies some towns surrounded by remote areas; Broken Hill and Kalgoorlie, for example, are treated as remote (MM 6). Store all three limits per item and choose at pricing time.

Five checks before the claim file

Here's the order we'd run them in, line by line, before anything goes into the bulk CSV.

Five checks on every item number before the claim file: valid on the date (C16, V10), right band from actual start and finish times, right claim type (C29), registered for it (C15), and unit price within the limit (V31, C06)

  1. Valid on the date. Look the number up in the catalogue version that was in force on the support date, using its start and end dates. A support from June claimed against a 2026-27 item, or a legacy item claimed after it ended, comes back as C16, "The support is not available for the dates entered".
  2. Right band. Recalculate the time-of-day item from the actual start and finish times, not the rostered ones.
  3. Right claim type. For suffix items, the suffix must match the work. For base items, the ClaimType must be one the catalogue flags allow. Otherwise, C29.
  4. Registered for it. The registration group in the number has to be one your organisation holds. If it isn't, the NDIA returns C15, "Provider is not registered for this support item". Watch supported independent living: the same SIL supports are listed under group 0115 and the new group 0138 at identical prices, so the number you claim has to match your registration.
  5. Within the limit. The unit price must be at or below the limit for the location. The bulk guide lists V31, "The unit price claimed is above the NDIS price limit", and it also notes that where an amount above the catalogue price gets through, only the limit is paid and the line is marked Capped = YES in the reconciliation file. Either way, you don't get the difference.

One more thing sits outside the item number but still stops claims: for participants on plans in the NDIA's newer system, you need to be one of their "my providers" for the support. Our PACE glossary entry explains what changed.

If you'd like a step-by-step version of the upload itself, our earlier dev.to post sets out a pre-upload check workflow for NDIS bulk payment requests with all 16 columns.

Free tools for the lookup step

You don't have to build the lookup to use it. Our free NDIS Price Guide 2026-27 searches all 976 current items, and each item has its own page with the national, remote and very remote amounts, the unit, and whether provider travel, short-notice cancellations and non-face-to-face delivery can be claimed. It runs in the browser and nothing you type is sent anywhere.

Rostery's free NDIS Price Guide 2026-27 tool, showing self-care weekday daytime at $73.58 an hour, Saturday at $103.54, sleepover at $311.79 and support coordination at $100.14, with a note that 611 printed prices were checked against the Pricing Schedule

Once you have a file, the NDIS claim file checker checks a bulk payment CSV against the 16-column format and every item and price against the 2026-27 catalogue, also in the browser, so the file never leaves your device.

How we handle it in Rostery

For anyone wondering how this works in a full system: in Rostery, our team loads each new Support Catalogue, compares it with the last one and publishes it with its effective date, and prices are looked up by the date of the support. The right band item is chosen for every shift when it's rostered and invoiced. The claim file is built in the NDIA's 16-column format, and if any line fails its checks the whole file is refused with a list of what to fix. Rostery doesn't connect to the NDIA portal, so your team still uploads the file.

Whatever you use, the pattern is the same: parse, look up by date, derive the band from real times, check the claim type and registration, then check the price.

Sources: NDIS Pricing Schedule 2026-27 (effective 24 September 2026), Parts 1 to 4; NDIS (Pricing Arrangements) Determination 2026; NDIS Support Catalogue 2026-27 v1.1; NDIS Pricing Arrangements and Price Limits 2025-26 v1.1; NDIA, Bulk payment requests guide (December 2025). Rostery feature and tool pages read 3 November 2026.

Written by the Rostery team in Sydney. Rostery makes rostering, care and billing software for NDIS and aged care providers.

Top comments (0)