Data Residency
Moesif runs in two regions. The global region is the default. The EU region stores your API analytics data at rest in the EU (Azure West Europe).
Existing customers don’t need to do anything. An organization’s region is set when the organization is created and can’t be changed later, and most organizations are in the global region.
Choose a region
To use the EU region, select Europe (West Europe) in the region selector when you create your Moesif organization. Every application in the organization uses that region.
You sign in to Moesif at www.moesif.com in either region. The dashboard routes your requests to your organization’s region.
Endpoints
Each region has its own hostnames. Paths are the same in both regions, so moving an integration to the EU region only changes the hostname.
| API | Global | EU |
|---|---|---|
| Collector API (events, actions, users, companies, OpenTelemetry) | https://api.moesif.net |
https://eu.api.moesif.net |
| Management API | https://api.moesif.com |
https://eu.api.moesif.com |
For example, an EU organization sends events to https://eu.api.moesif.net/v1/events and queries them at https://eu.api.moesif.com/v1/search/~/search/events.
Configure your integration
Integrations send data to the global Collector API unless you change their endpoint. For an EU organization, set the endpoint to https://eu.api.moesif.net:
| Integration | Setting |
|---|---|
| Apigee | <Property name="baseUri">https://eu.api.moesif.net</Property> in the JavaScript policy |
| AWS API Gateway | Firehose HTTP endpoint URL https://eu.api.moesif.net/v1/partners/aws/kinesis. Use the manual setup; the CloudFormation template only supports the global region |
| AWS Lambda (Node.js) | baseUri: "https://eu.api.moesif.net" |
| Ballerina | reporterBaseUrl = "https://eu.api.moesif.net" in Config.toml |
| Docusaurus | host: 'eu.api.moesif.net' in themeConfig.moesif |
| Envoy (WASM) | "base_uri": "eu.api.moesif.net" in the plugin configuration, and eu.api.moesif.net as the Moesif cluster address and sni |
| Gloo Gateway | environment variable BASE_URI=https://eu.api.moesif.net on the external processor |
| Go | moesifOption["Api_Endpoint"] = "https://eu.api.moesif.net" |
| Go (Gin) | moesifOption["Api_Endpoint"] = "https://eu.api.moesif.net" |
| gravitee.io | "baseUrl": "https://eu.api.moesif.net" |
| Java Spring Request | new MoesifAPIClient("YOUR_APPLICATION_ID", "https://eu.api.moesif.net") |
| Javascript (Browser) | host: 'eu.api.moesif.net' |
| Kong API Gateway | config.api_endpoint=https://eu.api.moesif.net |
| Kong Ingress Controller | api_endpoint: https://eu.api.moesif.net in the KongPlugin config |
| Kong Konnect | api_endpoint: https://eu.api.moesif.net in the plugin config |
| Kubernetes NGINX Ingress Controller | set $api_endpoint https://eu.api.moesif.net; in the server-snippet |
| LiteLLM | MoesifHandler(moesif_base_url="https://eu.api.moesif.net") |
| NGINX | config:set("api_endpoint", "https://eu.api.moesif.net") |
| Node.js (Express) | baseUri: "https://eu.api.moesif.net" |
| OpenTelemetry | exporter endpoints https://eu.api.moesif.net/v1/traces and https://eu.api.moesif.net/v1/logs |
| PHP (Symfony) | host: 'eu.api.moesif.net' under moesif.options |
| Play Framework | play.filters.moesifApiFilter.collectorEndpoint = "https://eu.api.moesif.net" |
| Python (Django) | 'BASE_URI': 'https://eu.api.moesif.net' |
| Python ASGI (FastAPI) | 'BASE_URI': 'https://eu.api.moesif.net' |
| Python Requests | 'LOCAL_MOESIF_BASEURL': 'https://eu.api.moesif.net' |
| Python Tornado | 'BASE_URI': 'https://eu.api.moesif.net' |
| Python WSGI (Flask, Bottle, Pyramid) | 'BASE_URI': 'https://eu.api.moesif.net' |
| Strapi | baseUri: "https://eu.api.moesif.net" in the moesif plugin config |
| Tyk API Gateway | meta.bulk_config.api_endpoint set to https://eu.api.moesif.net, or TYK_PMP_PUMPS_MOESIF_META_BULKCONFIG_APIENDPOINT=https://eu.api.moesif.net |
| WSO2 API Manager | moesif_base_url = "https://eu.api.moesif.net" under [apim.analytics.properties] in deployment.toml |
These integrations can’t send data to the EU region yet: Alexa Skills (Node.js), AWS Lambda (Go), AWS Lambda (Python), AWS Lambda (Ruby), Azure API Management, Azure Web App Extension, C# (.NET), Cloudflare Workers, Envoy (Lua), Express Gateway, Google Tag Manager, Java Servlet (Spring, Jersey), KrakenD, NGINX Plus, OkHttp (Java, Kotlin, etc), PHP (Laravel), PHP (Slim), Ruby (Rack, Rails), WSO2 Kubernetes Gateway.
If your integration is in that list or isn’t listed at all, contact us before you set it up for an EU organization.
For the Management API, replace api.moesif.com with eu.api.moesif.com in every request. This includes requests that generate embedded template tokens.
If you run Secure Proxy, set MOESIF_HOME_REGION=eu.
Region checks
The Collector API only accepts data for organizations in its own region. An EU organization’s Application Id is rejected by api.moesif.net, and a global organization’s Application Id is rejected by eu.api.moesif.net. Both return 403.
If your integration logs 403 errors that mention the home region, its endpoint doesn’t match your organization’s region. Change the endpoint to the one listed above.
Firewall allowlists
For an EU organization, allow outbound HTTPS (port 443) to eu.api.moesif.net for data collection and eu.api.moesif.com for the Management API.
If you have to allowlist IP addresses instead, the EU Collector API uses 13.248.191.0 and 35.71.169.49. Moesif recommends allowlisting the hostname, since IP addresses can change.