Skip to content
Last updated

B2B v2 Route Inventory

  • Audit date: 2026-07-17
  • Documentation baseline: ab124d9e25df
  • Backend baseline: 81686b34e5bc (origin/master)
  • Raw backend surface: 60 operations
  • Published public surface: 42 operations

Classification summary

ClassificationOperationsPublished
Public4242
Internal100
Needs decision80
Total6042

Seven of the needs decision operations are the Waiting List group. The available production Business User receives 403 for both collection reads, so they remain unpublished until a positive production contract can be verified with an authorized fixture.

The engineering ratio is therefore 42 of 60. The approved public denominator is currently 42, and all 42 approved operations are published. This does not imply that all 60 registered routes are approved public APIs.

Evidence legend

  • Auth P+U+L: Partner token, Business User token, and active Location license checks are required. Controllers may apply additional access checks.
  • Test I: a route-name integration test exists at the backend baseline.
  • Test N: no route-name or controller integration test was found.
  • Live: positive production behavior was verified during the 2026-07-15 contract audit or the 2026-07-16 canonical URL check.
  • Route: only route reachability, validation behavior, or a non-positive response was verified in production.
  • Source: controller, request, transformer, service, and/or UI consumer was inspected at the backend baseline.

All canonical routes below are relative to https://api.alteg.io/api/v2.

Published public operations

MethodCanonical routeBackend route nameControllerOpenAPI operation IDAuthTestEvidence
GET/locations/{location_id}/productsapi_v2.company.goods.listGoodsController::action_listlist_productsP+U+LILive
GET/locations/{location_id}/products/{product_id}api_v2.company.good.readGoodsController::action_readget_productP+U+LILive
GET/locations/{location_id}/products/{product_id}/storage_amountsapi_v2.company.good.storage_amounts.listGoodStorageAmountsController::action_listlist_product_storage_amountsP+U+LILive
GET/locations/{location_id}/products/autocompleteapi_v2.company.goods.autocompleteGoodsAutocompleteControllerautocomplete_productsP+U+LILive
GET/locations/{location_id}/unitsapi_v2.company.units.listUnitsController::action_listlist_product_unitsP+U+LILive
GET/locations/{location_id}/attendance_product_items/{attendance_product_item_id}api_v2.company.attendance_good_item.readAttendanceGoodItemsController::action_readget_attendance_product_itemP+U+LIRoute + Source; no safe positive fixture
GET/locations/{location_id}/product_categoriesapi_v2.company.good_categories.listGoodCategoriesController::action_listlist_product_categoriesP+U+LILive
GET/locations/{location_id}/product_categories/{product_category_id}api_v2.company.good_category.readGoodCategoriesController::action_readget_product_categoryP+U+LILive
GET/locations/{location_id}/service_categoriesapi_v2.company.service_categories.listServiceCategoriesController::action_listlist_service_categoriesP+U+LILive
GET/locations/{location_id}/services/{service_id}api_v2.company.service.readServiceReadControllerget_serviceP+U+LILive
GET/locations/{location_id}/servicesapi_v2.company.services.listServicesListControllerlist_servicesP+U+LILive
GET/locations/{location_id}/attendance_servicesapi_v2.company.attendance_services.listAttendanceServicesController::action_listlist_attendance_servicesP+U+LILive
GET/locations/{location_id}/composite_services/{service_id}/attendance_servicesapi_v2.company.composite_service.attendance_services_listCompositeServiceAttendanceServicesListControllerlist_composite_service_attendance_servicesP+U+LILive
GET/locations/{location_id}/attendance_service_suggestionsapi_v2.company.attendance_service_suggestions.listAttendanceServiceSuggestionsController::action_listlist_attendance_service_suggestionsP+U+LNLive
GET/locations/{location_id}/resource_occupationsapi_v2.company.resource_occupations.listResourceOccupationsListControllerlist_resource_occupationsP+U+LILive
GET/locations/{location_id}/custom_fieldsapi_v2.company.custom_fields.listCustomFieldsController::action_listlist_custom_fieldsP+U+LILive
GET/locations/{location_id}/team_membersapi_v2.company.staff.listStaffController::action_listlist_team_membersP+U+LILive
GET/locations/{location_id}/appointmentsapi_v2.company.records.listRecordsListControllerlist_appointmentsP+U+LNLive
GET/locations/{location_id}/attendances/{attendance_id}/appointmentsapi_v2.company.attendance.records.listAttendanceRecordsController::action_listlist_attendance_appointmentsP+U+LNLive with record_ and visit_ identifiers
DELETE/locations/{location_id}/appointments/{appointment_id}api_v2.company.record.deleteRecordDeleteControllerdelete_appointmentP+U+LIRoute + Source
POST/locations/{location_id}/timetable/appointments/deleteapi_v2.company.timetable.record.deleteTimetableRecordDeleteControllerdelete_timetable_appointmentP+U+LNRoute + Source
GET/locations/{location_id}/attendance/clients/{client_id}api_v2.company.attendance.client.readAttendanceClientsController::action_readget_attendance_booking_userP+U+LNLive
GET/locations/{location_id}/clients/{client_id}/attendances_statisticapi_v2.company.client.attendances_statistic.readSalonAttendancesStatisticControllerget_booking_user_location_attendance_statisticsP+U+LILive
GET/locations/{location_id}/clients/{client_id}/chain_attendances_statistic/{chain_id}api_v2.company.client.chain_attendances_statistic.readChainAttendancesStatisticControllerget_booking_user_chain_attendance_statisticsP+U+LILive
POST/locations/{location_id}/eventsapi_v2.company.activities.createActivityController::action_createcreate_eventP+U+LILive
GET/locations/{location_id}/eventsapi_v2.company.activities.listActivityController::action_listlist_eventsP+U+LNLive
GET/locations/{location_id}/events/{event_id}api_v2.company.activities.readActivityController::action_readget_eventP+U+LILive
PUT/locations/{location_id}/events/{event_id}api_v2.company.activities.updateActivityController::action_updateupdate_eventP+U+LILive
DELETE/locations/{location_id}/events/{event_id}api_v2.company.activities.deleteActivityController::action_deletedelete_eventP+U+LILive
POST/locations/{location_id}/events/{event_id}/appointmentsapi_v2.company.activities.records.createActivityRecordCreateControllercreate_event_appointmentP+U+LIValidation + Source
PUT/locations/{location_id}/events/{event_id}/appointments/{appointment_id}api_v2.company.activities.records.updateActivityRecordUpdateControllerupdate_event_appointmentP+U+LIValidation + Source
PATCH/locations/{location_id}/events/{event_id}/appointments/{appointment_id}api_v2.company.activities.records.rescheduleActivityRecordRescheduleControllerreschedule_event_appointmentP+U+LNValidation + Source
GET/locations/{company_id}/tagsapi_v2.company.tags.listTagsController::action_listlist_tagsP+U+LILive; /companies response identical
GET/locations/{company_id}/tags/{tag_id}api_v2.company.tags.readTagsController::action_readget_tagP+U+LILive
POST/locations/{company_id}/tagsapi_v2.company.tags.createTagsController::action_createcreate_tagP+U+LILive
PUT/locations/{company_id}/tags/{tag_id}api_v2.company.tags.updateTagsController::action_updateupdate_tagP+U+LILive
DELETE/locations/{company_id}/tags/{tag_id}api_v2.company.tags.deleteTagsController::action_deletedelete_tagP+U+LILive
GET/locations/{company_id}/positionsapi_v2.company.positions.listPositionsController::action_listlist_positionsP+U+LILive; /companies response identical
GET/locations/{company_id}/positions/{position_id}api_v2.company.positions.readPositionsController::action_readget_positionP+U+LILive
POST/locations/{company_id}/positionsapi_v2.company.positions.createPositionsController::action_createcreate_positionP+U+LILive
PUT/locations/{company_id}/positions/{position_id}api_v2.company.positions.updatePositionsController::action_updateupdate_positionP+U+LILive
DELETE/locations/{company_id}/positions/{position_id}api_v2.company.positions.deletePositionsController::action_deletedelete_positionP+U+LILive

The literal company_id parameter remains in Tags and Positions for SDK compatibility. It identifies a Location. The middleware also accepts the legacy /companies/{company_id} path alias.

Unpublished operations

MethodCanonical routeBackend route nameControllerKnown consumerTestClassification and evidence
GET/locations/{location_id}/attendance_services/autocompleteapi_v2.company.attendance_services.autocompleteAttendanceServicesAutocompleteControllerserviceAutocompleteApiNNeeds decision; Source; backend marks route for deletion
POST/locations/{location_id}/attendance/appointmentsapi_v2.company.attendance.records.updateAttendanceControllerBackoffice attendance editorIInternal; UI-state mutation
GET/locations/{location_id}/attendance/field_pinsapi_v2.company.attendance.field_pin.listUserAttendanceFieldPinsController::action_listattendancePinItemsApiIInternal; per-user UI state
POST/locations/{location_id}/attendance/field_pinsapi_v2.company.attendance.field_pin.pinUserAttendanceFieldPinsController::action_pinattendancePinItemsApiIInternal; per-user UI state
DELETE/locations/{location_id}/attendance/field_pins/{slug}api_v2.company.attendance.field_pin.unpinUserAttendanceFieldPinsController::action_unpinattendancePinItemsApiIInternal; per-user UI state
PUT/locations/{location_id}/attendance/payment_method_pinsapi_v2.company.attendance.payment_method_pins.updateUserAttendancePaymentMethodPinsController::action_updateattendancePinPaymentMethodsApiIInternal; per-user UI state
GET/locations/{location_id}/attendance/payment_method_pinsapi_v2.company.attendance.payment_method_pins.listUserAttendancePaymentMethodPinsController::action_listattendancePinPaymentMethodsApiIInternal; per-user UI state
POST/locations/{location_id}/comers/{client_id}/vehiclesapi_v2.company.comer.vehicles.createComerInfoVehiclesController::action_createcomerApiV2, client and visit modalsNInternal; backoffice-specific profile state
PATCH/locations/{location_id}/comers/{comer_id}/vehiclesapi_v2.company.comer.vehicles.updateComerInfoVehiclesController::action_updatecomerApiV2, client and visit modalsNInternal; backoffice-specific profile state
GET/locations/{location_id}/comers/{client_id}/vehiclesapi_v2.company.comer.vehicles.listComerInfoVehiclesController::action_listcomerApiV2, client and visit modalsNInternal; backoffice-specific profile state
DELETE/locations/{location_id}/comers/{comer_id}/vehiclesapi_v2.company.comer.vehicles.deleteComerInfoVehiclesController::action_deletecomerApiV2, client and visit modalsNInternal; backoffice-specific profile state
GET/locations/{location_id}/waiting_listapi_v2.company.waiting_list.searchSearchWaitingListEntryControllerBackoffice WaitingListApiINeeds decision; production 403; unregistered draft get_waiting_list_v2 exists
GET/locations/{location_id}/waiting_list/countapi_v2.company.waiting_list.countCountWaitingListEntryControllerBackoffice Waiting List widgetINeeds decision; production 403; no OpenAPI draft
POST/locations/{location_id}/waiting_listapi_v2.company.waiting_list.createCreateWaitingListEntryControllerBackoffice WaitingListApiINeeds decision; unsafe without controlled Booking User; unregistered draft exists
GET/locations/{location_id}/waiting_list/{waiting_list_entry_id}api_v2.company.waiting_list.readReadWaitingListEntryControllerBackoffice Waiting List editorINeeds decision; no safe positive fixture
PUT/locations/{location_id}/waiting_list/{waiting_list_entry_id}api_v2.company.waiting_list.updateUpdateWaitingListEntryControllerBackoffice WaitingListApiINeeds decision; unsafe without controlled Booking User; unregistered draft exists
POST/locations/{location_id}/waiting_list/{waiting_list_entry_id}/finishapi_v2.company.waiting_list.finishFinishWaitingListEntryControllerBackoffice WaitingListApiINeeds decision; notification/workflow safety unverified
DELETE/locations/{location_id}/waiting_list/{waiting_list_entry_id}api_v2.company.waiting_list.deleteDeleteWaitingListEntryControllerBackoffice WaitingListApiINeeds decision; cleanup route source-verified; unregistered draft exists

Production checks performed in this refresh

  • Authenticated Tags list: canonical /locations and compatibility /companies both returned 200 with identical response bodies.
  • Authenticated Positions list: canonical /locations and compatibility /companies both returned 200 with identical response bodies.
  • Waiting List list and count: the only managed Location returned 403 for both operations. No Waiting List write was attempted.
  • Attendance Appointments: positive 200 collection responses were verified with both record_{appointment_id} and visit_{visit_id} identifiers. An invalid identifier returned 422, and a missing attendance group returned 404.
  • Attendance Booking User: positive 200 item responses were verified for several Booking User profiles without retaining personal data. The base response returned the client resource type and an empty meta array.
  • Product Units returned 200 with 38 JSON:API unit resources.
  • Attendance Services returned 200; a composite Service fixture was then used to verify its component Attendance Services with another 200.
  • Resource Occupations, Attendance Service Suggestions, and Appointment Custom Fields returned 200 with deterministic empty collections for safe fixtures.
  • Booking User Location and Chain attendance statistics returned 200 item responses with the expected JSON:API resource types and deposit relationship.
  • No production data was created, updated, deleted, or included in this file.

Next decision gate

Waiting List coverage requires a Business User and Location with positive read access. Publishing list and count then requires observed 200 shapes and a passing read-only Arazzo workflow. Its remaining five operations additionally require a controlled Booking User, notification safety, and guaranteed cleanup.

The other remaining read candidate requires a decision on the autocomplete route that the backend marks for deletion.