# 5. API Reference xly exposes three distinct HTTP surfaces, hosted in three separate Spring Boot services. Each is documented on its own page below; the conceptual overview lives in [concepts/api-surface](../concepts/api-surface.md). | Page | Service | Context path | Use when | |---|---|---|---| | [Internal API](internal.md) | `xlyEntry` | `/xlyEntry` | You are extending the SPA or maintaining the framework runtime. | | [External API](external.md) | `xlyApi` | `/xlyApi` | You are integrating an outside system that calls xly. | | [Webhooks](webhooks.md) | `xlyInterface` | `/xlyInterface` | A third-party system needs to push events into xly. | | [Messaging](messaging.md) | `xlyEntry` + `xlyErpJms*` | n/a (ActiveMQ / RocketMQ) | An asynchronous, fan-out integration is more appropriate than a synchronous HTTP call. | | [Notifications](notifications.md) | `xlyMsg` (consumed as a library by `xlyEntry`, `xlyBusinessService`, `xlyInterface`, `xlyFlow`) | n/a (DingTalk / WeChat / email APIs) | A business event needs to push a chat-platform message or email to a user. | ## Reading order If you arrived here as an external integrator, start with [External API](external.md). If you're a Java developer extending the framework, start with [Internal API](internal.md) (most of the universal CRUD machinery is documented in the [Maintainer runtime chapter](../reference/maintainer/runtime.md); this chapter cross-links to it). ## Cross-cutting facts - **Auth.** Internal calls use the SPA's session cookie + the `@CurrentUser` argument resolver. External calls use bearer tokens obtained from `/xlyApi/token/getToken`. Webhooks have per-channel conventions (signature header, query-param secret). - **Tenant scoping.** Every authenticated controller method, in every service, runs `RequestAddParamUtil.me().addParams(params, userInfo)` before doing any work — see [the multi-tenancy concept page](../concepts/multi-tenancy.md). A request that bypasses this is a multi-tenant bug. - **Logging.** External calls are logged to `sysapilog`; internal calls use the framework's standard `syslog4j` setup; webhooks log to whatever the per-channel handler chooses.