Skip to content

Store Endpoints

These endpoints are used to manage the stores of a vendor. This can also be done on the anybill Partner Portal.
The most important usecase of these endpoints is to enable larger companies to automate the process of syncing store details.

  • GET /v3/store?skip=0&take=100: list the stores of the vendor (200 with a Total-Count response header, 204 if there are none).
  • POST /v3/store: create or update a store (201 when a new store was created, 200 when an existing store was updated).
  • GET /v3/store/{id}: read a single store (404 if unknown).
  • DELETE /v3/store/{id}: delete a store (204, 404 if unknown).
  • POST /v3/store/search: find a store by address; the body is a JSON object with an address, the response body is the store id as a string (404 if no store matches).

All store routes require an access token with the https://ad.anybill.de/vendor/store scope (see Authentication).

Detailed Endpoint Description

Staging Environment: SwaggerUI
Production Environment: SwaggerUI

Create Store

To automate the onboarding process of a merchant, anybill provides an endpoint to onboard and activate stores for digital receipts. This operation creates stores at anybill and assigns a unique Store ID. Additionally, this interface replaces the manual entry of stores in the Anybill portal. It can also be utilized in special cases, such as when store IDs cannot be manually entered into the cash register (e.g., due to a lack of a feedback channel to the cash register).

POST /v3/store

Request Body:

json
{
  "id": "string, max. 36 chars, optional – generated by anybill if omitted",
  "displayName": "string, 1–64 chars",
  "legalName": "string, max. 128 chars",
  "address": {
    "countryCode": "string, ISO 3166-1 alpha-3",
    "zip": "string, max. 12 chars",
    "city": "string, max. 150 chars",
    "street": "string, max. 150 chars",
    "number": "string, max. 15 chars"
  },
  "vatId": "string, max. 24 chars",
  "language": "string, ISO 639-1"
}

The route is an upsert: if a store with the given id already exists for the vendor, its details are updated and 200 OK is returned; otherwise the store is created and 201 Created is returned. Both responses carry the resulting store object. address is mandatory and must contain countryCode (the older country name is deprecated).

Search store by address

Additionally, it can occur that cash registers in a shop cannot communicate with each other, and thus, calling the Create Store Endpoint might create duplicates. For this scenario, anybill provides the Search Store Endpoint, allowing you to check in advance whether a store already exists for the address integrated into the cash register. If no store exists, you need to create a store using the Create Store Endpoint. If a store already exists, the Store ID is returned, which should then be used in the receipt data for creating digital receipts.

POST /v3/store/search

Request Body:

json
{
  "address": {
    "countryCode": "DEU",
    "zip": "86150",
    "city": "Augsburg",
    "street": "Musterstraße",
    "number": "1"
  }
}

Response: 200 OK with the store id as a JSON string (e.g. "3QT1su7Wtl"), or 404 Not Found if no store matches the address.

onboarding from a POS

Status codes

The Retry column is the behaviour a POS system has to implement for each code; the common rules (backoff, attempts, token refresh on 401) are described in the Retry Policy Guidelines. All store endpoints are idempotent: resending the identical request after a 5xx or a network error is safe. None of them returns 429.

StatusEndpointsWhenBodyRetry
200GET /v3/store, GET /v3/store/{id}, POST /v3/store (updated), POST /v3/store/searchSuccess.JSON (list, store object or store id string)
201POST /v3/storeA new store was created.store object
204GET /v3/store (no stores), DELETE /v3/store/{id}Success without content.empty
400POST /v3/store, POST /v3/store/search, DELETE /v3/store/{id}Payload invalid, or the store could not be saved / deleted for a business reason.problem details with errors and traceIdno – fix the payload; log the traceId
401allToken missing, expired or invalid.empty or plain textrefresh the token, resend once
403allMissing vendor/store scope or API user permission.plain textno
404GET /v3/store/{id}, DELETE /v3/store/{id}, POST /v3/store/searchUnknown store id, or no store matches the address.empty or plain textno – for DELETE treat it as already deleted; for search create the store
500 / 502 / 503 / 504allTemporary server or gateway problem.empty or plain textyes – exponential backoff, identical request

Required Fields

These fields are validated against the OpenAPI schema. Fields listed as required once the surrounding object is sent belong to an optional part of the payload — omitting that part entirely is fine, including it makes the listed fields mandatory.

Generated from the production OpenAPI specification (API version 3.0) on 3 September 2026.

GET /v3/store

No required parameters and no request body.

POST /v3/store

Request body: UpsertStoreDto

Always required

FieldTypeDescription
addressAddressDto
address.zipstring, 1–12 charsZip code / postal code of the address.
address.citystring, 1–150 charsCity of the address.
address.streetstring, 1–150 charsStreet name of the address.

Required once the surrounding optional object is sent

ObjectPosition in the request bodyRequired fields
StoreOpeningHoursDtostoreOpeningHours[]dayOfWeek, open, close

GET /v3/store/

NameLocationTypeDescription
storeIdpath parameterstringThe id of the store.

DELETE /v3/store/

NameLocationTypeDescription
storeIdpath parameterstringThe id of the store.

POST /v3/store/search

Request body: SearchStoreDto

Always required — none.

Required once the surrounding optional object is sent

ObjectPosition in the request bodyRequired fields
AddressDtoaddresszip, city, street

Built 2026-09-16 21:51 CEST from commit d540524