Invoice series
An invoice series supplies the configured series prefix. Account numbering generates numbers such as INV-00001. Customer numbering combines that prefix with the customer's invoice prefix to generate codes such as INV-ABCDEF-00001, while the invoice still belongs to the configured INV series. Customerless simplified invoices use the base sequence. Internal numbering keys and counters are intentionally not exposed or editable.
Accounts configure separate defaults for invoices, credit notes, and amendment replacements. Every account starts with an invoice default. Global-regime accounts leave the other two empty until you configure them; Spanish accounts start with three distinct defaults.
Account numbering is the default, including for Spanish accounts. The account's invoice_numbering_scope setting applies to every series. Customer numbering is opt-in. FiscalRail keeps one VERI*FACTU registration chain per account, but you should confirm that customer-specific numbering is appropriate for your business before enabling it.
Prefixes contain at most 20 uppercase letters or digits. FiscalRail normalizes input on creation and update. A prefix can be changed only before the series has issued its first invoice. Test-account prefixes always begin with the reserved TEST- marker, which FiscalRail adds automatically and counts toward the 20-character limit. A live-account prefix cannot begin with that marker.
A series can be deleted only before it has been used and only while it is not an account default. Once used, the series prefix and every issued invoice number remain immutable.
Read Invoice numbering for the complete configuration workflow, customer-prefix lifecycle, and scope-switching behavior.
The Invoice Series object
id
string
object
string
invoice_series.live
boolean
account
string
prefix
string
default_for
array of enums
created_at
string
{
"id": "inv_ser_14Vxtqg4QFd6rL8cUoK3sZ",
"object": "invoice_series",
"live": true,
"account": "acct_14Vxtqg2nwvPR75TpsGH8N",
"prefix": "INV",
"default_for": [
"invoice"
],
"created_at": "2026-07-31T09:00:00Z"
}
Create an invoice series
/v1/invoice-seriesCreates an invoice-series family. The account's invoice numbering scope applies to every series. The first series is automatically made the account default.
prefix
string
required
TEST- for test accounts.default_for
array of enums
201
An Invoice Series object.
JSON
import os
from fiscalrail import FiscalRail
client = FiscalRail(os.environ["FISCALRAIL_API_KEY"])
series = client.invoice_series.create(
prefix="2027",
default_for=[
"invoice",
],
)
curl --request POST \
'https://api.fiscalrail.com/v1/invoice-series' \
--header "Authorization: Bearer ak_test_..." \
--json '{
"prefix": "2027",
"default_for": [
"invoice"
]
}'
{
"id": "inv_ser_14Vxtqg4QFd6rL8cUoK3sZ",
"object": "invoice_series",
"live": true,
"account": "acct_14Vxtqg2nwvPR75TpsGH8N",
"prefix": "INV",
"default_for": [
"invoice"
],
"created_at": "2026-07-31T09:00:00Z"
}
Retrieve an invoice series
/v1/invoice-series/{id}id
string
required
200
An Invoice Series object.
JSON
import os
from fiscalrail import FiscalRail
client = FiscalRail(os.environ["FISCALRAIL_API_KEY"])
series = client.invoice_series.retrieve(
"inv_ser_14Vxtqg4QFd6rL8cUoK3sZ",
)
curl --request GET \
'https://api.fiscalrail.com/v1/invoice-series/inv_ser_14Vxtqg4QFd6rL8cUoK3sZ' \
--header "Authorization: Bearer ak_test_..."
{
"id": "inv_ser_14Vxtqg4QFd6rL8cUoK3sZ",
"object": "invoice_series",
"live": true,
"account": "acct_14Vxtqg2nwvPR75TpsGH8N",
"prefix": "INV",
"default_for": [
"invoice"
],
"created_at": "2026-07-31T09:00:00Z"
}
Update an invoice series
/v1/invoice-series/{id}Changes the prefix or account operations that use this series by default.
Numbering scope is configured on the account and applies to every series.
The prefix can be changed only before the series has issued its first invoice.
id
string
required
prefix
string
TEST- marker for test accounts. It cannot be changed after the series has issued an invoice.default_for
array of enums
200
The updated Invoice Series object.
JSON
import os
from fiscalrail import FiscalRail
client = FiscalRail(os.environ["FISCALRAIL_API_KEY"])
series = client.invoice_series.update(
"inv_ser_14Vxtqg4QFd6rL8cUoK3sZ",
prefix="SALES",
default_for=[
"invoice",
],
)
curl --request PATCH \
'https://api.fiscalrail.com/v1/invoice-series/inv_ser_14Vxtqg4QFd6rL8cUoK3sZ' \
--header "Authorization: Bearer ak_test_..." \
--json '{
"prefix": "SALES",
"default_for": [
"invoice"
]
}'
{
"id": "inv_ser_14Vxtqg4QFd6rL8cUoK3sZ",
"object": "invoice_series",
"live": true,
"account": "acct_14Vxtqg2nwvPR75TpsGH8N",
"prefix": "INV",
"default_for": [
"invoice"
],
"created_at": "2026-07-31T09:00:00Z"
}
Delete an invoice series
/v1/invoice-series/{id}Deletes an invoice series that has not been used to issue an invoice.
id
string
required
204
The invoice series was deleted. The response has no body.
import os
from fiscalrail import FiscalRail
client = FiscalRail(os.environ["FISCALRAIL_API_KEY"])
client.invoice_series.delete(
"inv_ser_14Vxtqg4QFd6rL8cUoK3sZ",
)
curl --request DELETE \
'https://api.fiscalrail.com/v1/invoice-series/inv_ser_14Vxtqg4QFd6rL8cUoK3sZ' \
--header "Authorization: Bearer ak_test_..."
List invoice series
/v1/invoice-seriesReturns invoice series in reverse chronological ID order.
limit
integer
25.starting_after
string
ending_before.ending_before
string
starting_after.
200
A list of Invoice Series objects.
JSON
import os
from fiscalrail import FiscalRail
client = FiscalRail(os.environ["FISCALRAIL_API_KEY"])
series = client.invoice_series.list(
limit=25,
)
curl --request GET \
'https://api.fiscalrail.com/v1/invoice-series?limit=25' \
--header "Authorization: Bearer ak_test_..."
{
"object": "list",
"has_more": null,
"data": [
{
"id": "inv_ser_14Vxtqg4QFd6rL8cUoK3sZ",
"object": "invoice_series",
"live": true,
"account": "acct_14Vxtqg2nwvPR75TpsGH8N",
"prefix": "INV",
"default_for": [
"invoice"
],
"created_at": "2026-07-31T09:00:00Z"
}
]
}