Products: Creates a new invoice product.
POST
/api/invoicing/products
deprecated
Requires: Invoicing.Products, Invoicing.Products.Create, merchant scope.
A `productCode` another of the biller's products already holds (compared case-insensitively) is refused as a validation error on that field, so no two products of one biller share a SKU.
Example request
Every block below sends the same request. Replace {{BASE_URL}} with the address of the API you are calling and {{API_KEY}} with your own key.
The request body is a InvoiceProductCreateDto. See the Request body section below for its fields.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
suppressNulls
required |
query | boolean | If true, omit properties with null values. |
Request body
application/json
, required
| Field | Type | Description |
|---|---|---|
name
required |
string | nullablemax length 200 |
description
required |
string | Conditional: When Description is not empty. Max length: 1000. nullable |
productCode
required |
string | Optional SKU or product code. Stored trimmed, with its letter case kept. Unique within the biller, compared case-insensitively: a code another of the biller's products already holds is rejected with a validation error naming this field. Leave it empty (or send whitespace, which is stored as no code) for a product without a code; any number of those may exist. Conditional: When ProductCode is not empty. Max length: 50. nullable |
imageBlobName
required |
string | Bare blob filename of the product image, as returned by the hosted-page image upload endpoint (`POST /api/hostedpaymentpages/images/upload`). Omit or send null to leave the product without an image; an empty string also clears it. Never a URL, a path, or inline image data. nullable |
defaultPrice
required |
number (double) | min 0 |
taxCategoryId
required |
string (uuid) | Superseded by `defaultTaxRateId`; retained for compatibility, not read. Accepted and stored as sent, and never applied to a line item. nullable |
defaultTaxRateId
required |
string (uuid) | Optional. The id of one of the biller's active tax rates, applied to an invoice line when this product is picked. Must belong to the same biller as the product; a rate that does not exist, belongs to another biller, or has been deactivated is rejected with a validation error naming this field. Omit or send null for no default. nullable |
isActive
required |
boolean | nullable |
sortOrder
required |
integer (int32) | nullable |
currency
required |
string | Conditional: When Currency is not empty. Max length: 3. nullable |
pricingModel
required |
all of PricingModel | nullable |
allowCustomPrice
required |
boolean | nullable |
productType
required |
all of ProductType | nullable |
isTaxable
required |
boolean | nullable |
taxCode
required |
string | Conditional: When TaxCode is not empty. Max length: 50. nullable |
unitOfMeasure
required |
string | Conditional: When UnitOfMeasure is not empty. Max length: 50. nullable |
allowFractionalQuantity
required |
boolean | nullable |
minimumQuantity
required |
number (double) | Conditional: When MinimumQuantity is not null. Must be >= 0. nullable |
maximumQuantity
required |
number (double) | Conditional: When MaximumQuantity is not null. Must be >= 0. nullable |
requiresShipping
required |
boolean | nullable |
weight
required |
number (double) | nullablemin 0max 999999.9999 |
weightUnit
required |
all of ShippingWeightUnit | Required: When Weight is not null. nullable |
length
required |
number (double) | nullablemin 0max 99999.9999 |
width
required |
number (double) | nullablemin 0max 99999.9999 |
height
required |
number (double) | nullablemin 0max 99999.9999 |
dimensionUnit
required |
all of ShippingDimensionUnit | Required: When Length is not null or Width is not null or Height is not null. nullable |
revenueAccount
required |
string | Conditional: When RevenueAccount is not empty. Max length: 100. nullable |
deferredRevenue
required |
boolean | nullable |
recognitionRuleId
required |
string (uuid) | nullable |
tags
required |
array of EntityTag | nullable |
billerId
required |
string (uuid) | |
billerType
required |
InvoicePartyType | Identifies the type of entity acting as the biller or recipient on an invoice. one of: GatewayOwner, Reseller, Merchant, Customer |
This request body has no documented fields.
Responses
200 OK
Body: InvoiceProductDto
Each item has these fields.
| Field | Type | Description |
|---|---|---|
id
required |
string (uuid) | |
creationTime
required |
string (date-time) | The date and time when this entity was created. |
creatorId
required |
string (uuid) | The ID of the user who created this entity. nullable |
lastModificationTime
required |
string (date-time) | The date and time when this entity was last modified. nullable |
lastModifierId
required |
string (uuid) | The ID of the user who last modified this entity. nullable |
billerId
required |
string (uuid) | |
billerType
required |
InvoicePartyType | Identifies the type of entity acting as the biller or recipient on an invoice. one of: GatewayOwner, Reseller, Merchant, Customer |
name
required |
string | nullable |
description
required |
string | nullable |
productCode
required |
string | nullable |
imageBlobName
required |
string | Bare blob filename of the product image in the hosted-page image container, or null when the product has no image. Rendered at `{cdn}/hosted-page-imgs/host/{name}`. nullable |
defaultPrice
required |
number (double) | |
taxCategoryId
required |
string (uuid) | Superseded by `defaultTaxRateId`; retained for compatibility, not read. nullable |
defaultTaxRateId
required |
string (uuid) | The biller's tax rate applied to an invoice line when this product is picked, or null when the product carries no default. nullable |
isActive
required |
boolean | nullable |
sortOrder
required |
integer (int32) | nullable |
currency
required |
string | nullable |
pricingModel
required |
all of PricingModel | nullable |
allowCustomPrice
required |
boolean | nullable |
productType
required |
all of ProductType | nullable |
isTaxable
required |
boolean | nullable |
taxCode
required |
string | nullable |
unitOfMeasure
required |
string | nullable |
allowFractionalQuantity
required |
boolean | nullable |
minimumQuantity
required |
number (double) | nullable |
maximumQuantity
required |
number (double) | nullable |
requiresShipping
required |
boolean | nullable |
weight
required |
number (double) | nullable |
weightUnit
required |
all of ShippingWeightUnit | nullable |
length
required |
number (double) | nullable |
width
required |
number (double) | nullable |
height
required |
number (double) | nullable |
dimensionUnit
required |
all of ShippingDimensionUnit | nullable |
revenueAccount
required |
string | nullable |
deferredRevenue
required |
boolean | nullable |
recognitionRuleId
required |
string (uuid) | nullable |
tags
required |
array of EntityTag | nullable |
archivedAt
required |
string (date-time) | nullable |
concurrencyStamp
required |
string | nullable |
This response has no documented body fields.
403 Forbidden
Body: RemoteServiceErrorResponse
Each item has these fields.
| Field | Type | Description |
|---|---|---|
error
required |
RemoteServiceErrorInfo |
This response has no documented body fields.
401 Unauthorized
Body: RemoteServiceErrorResponse
Each item has these fields.
| Field | Type | Description |
|---|---|---|
error
required |
RemoteServiceErrorInfo |
This response has no documented body fields.
400 The request is invalid, including a `productCode` already held by another product of the same biller.
Body: RemoteServiceErrorResponse
Each item has these fields.
| Field | Type | Description |
|---|---|---|
error
required |
RemoteServiceErrorInfo |
This response has no documented body fields.
404 Not Found
Body: RemoteServiceErrorResponse
Each item has these fields.
| Field | Type | Description |
|---|---|---|
error
required |
RemoteServiceErrorInfo |
This response has no documented body fields.
501 Not Implemented
Body: RemoteServiceErrorResponse
Each item has these fields.
| Field | Type | Description |
|---|---|---|
error
required |
RemoteServiceErrorInfo |
This response has no documented body fields.
500 Internal Server Error
Body: RemoteServiceErrorResponse
Each item has these fields.
| Field | Type | Description |
|---|---|---|
error
required |
RemoteServiceErrorInfo |
This response has no documented body fields.
default The request failed. The body carries the standard error envelope: a machine-readable `error.code`, a human-readable `error.message`, and `error.validationErrors` when the failure was a validation rejection. See the error-code reference in this document's description for the values `error.code` can take.
Body: RemoteServiceErrorResponse
Each item has these fields.
| Field | Type | Description |
|---|---|---|
error
required |
RemoteServiceErrorInfo |
This response has no documented body fields.
429 The request was refused because a rate limit was exceeded. Wait at least the interval `Retry-After` names before retrying, then back off. Limits are tuned per deployment, so read the allowance from the response headers rather than assuming a fixed ceiling.
Body: RateLimitProblemDetails
Each item has these fields.
| Field | Type | Description |
|---|---|---|
type
required |
string | The problem type identifier. Always the same value: the failure is the status code itself, so there is no sub-type for a caller to branch on. nullable |
title
required |
string | A short, human-readable summary of the problem type. nullable |
status
required |
integer (int32) | The HTTP status code, repeated in the body as the problem-details format defines. |
detail
required |
string | A human-readable explanation of this occurrence of the problem. nullable |
retryAfterSeconds
required |
integer (int32) | How long to wait before retrying, in whole seconds, carrying the same figure as the `Retry-After` header. Always at least one: a value of zero would invite an immediate retry that is certain to be rejected again. |
This response has no documented body fields.
Errors
A failed request returns the platform error envelope. The
error reference lists every value
error.code can carry and shows the four response shapes.