Skip to main content
Apitally is built with a strong focus on data privacy. We hold ourselves to these principles:
  • Collect only the data that’s required
  • Offer extensive configuration options to control data collection, masking and filtering
  • Provide full transparency about what data is collected and how it’s handled
Because all Apitally SDKs are open-source, you can verify yourself how they work and what data they collect.

Data collection

This is a complete overview of the data collected by Apitally.
The configuration options mentioned throughout this page are in snake_case notation, as used in Python. Check out the SDK reference for your language to see the equivalent parameter names.
Icons indicate configurable data collection and masking support: = Configurable, collected by default
= Configurable, not collected by default
= Supports masking

Application metadata

The Apitally SDKs record details of your application’s API, configuration and runtime environment.
HTTP methods and route paths identified by the SDK, with summaries and descriptions where the framework provides them.Example:
Framework identifier, runtime and framework package versions, and an application version if you provide one.Example versions:
SDK settings, including capture and sampling settings and custom masking and exclusion patterns. Configured callbacks are recorded as true, not their code. The write token is excluded.
The complete generated OpenAPI specification, when available from FastAPI, Litestar, Django REST Framework or Django Ninja.
Service name, a random instance identifier, environment, and the names and versions of the Apitally and OpenTelemetry SDKs.Custom OpenTelemetry resource attributes supplied through environment variables or an existing provider are also included.

Application metrics

CPU utilization, memory usage and uptime are measured periodically for each application process.
CPU utilization of the application process.
Resident memory usage of the application process.
Uptime in seconds.

Request metrics

Request measurements are combined into counts and histograms within your application before being sent to Apitally.
Method and path of the endpoint that handled the request.Example: POST /v1/orders
Status code of the response.Example: 200 OK
Size of the request body. Recorded as a histogram.Example: 5 KB
Size of the response body. Recorded as a histogram.Example: 5 KB
Time taken by your application to respond to the request. Recorded as a histogram.Example: 80 ms
Consumer identifier, and optionally name, group and custom attributes, as provided by your own implementation.See the setup guide for your framework for how to associate requests with consumers.Example:
Details about validation errors leading to a 4xx response. Includes source, field name, message and error type.Only captured if a supported framework is used. See here for details.Example:
Exception type, message and stack trace. May also include a Sentry event ID, if available.Only captured if an exception occurred during request handling, leading to a 500 Internal Server Error response.Example:

Request logs

Request logs contain details of individual requests, along with associated application logs and traces.
Method and path of the endpoint that handled the request.Example: POST /v1/orders
The full request URL, including query parameters.Default masking rules apply to query parameter values. Additional masking rules can be specified using mask_query_params.Example: https://api.example.com/v1/books?search=api+design
IP address of the client, as reported by your framework.Example: 192.0.2.1
User agent string identifying the client software.Example: curl/8.10.1
Example: 200 OK
Size of the request body in bytes.Example: 4786 bytes
Only collected if enabled via capture_request_headers (disabled by default). Default masking rules apply. Additional masking rules can be specified using mask_headers.Example:
Only collected if enabled via capture_request_body (disabled by default). Default masking rules apply. Additional masking rules can be specified using mask_body_fields and mask_request_body.Example:
Size of the response body in bytes.Example: 4678 bytes
Can be disabled via capture_response_headers (enabled by default). Default masking rules apply. Additional masking rules can be specified using mask_headers.Example:
Only collected if enabled via capture_response_body (disabled by default). Default masking rules apply. Additional masking rules can be specified using mask_body_fields and mask_response_body.Example:
Time taken by your application to respond to the request.Example: 82 ms
Consumer identifier, and optionally name, group and custom attributes, as provided by your own implementation.See the setup guide for your framework for how to associate requests with consumers.Example:
Application log records associated with the request, including messages, timestamps, severity, logger information and available attributes.Can be disabled via capture_logs (enabled by default).Example:
The request span and associated OpenTelemetry spans, including their attributes. These can contain custom request attributes, outgoing request URLs and database queries supplied by instrumentation.Example:
Exception type, message and stack trace recorded in the request’s trace. May also include a Sentry event ID, if available.Example:

Data masking

The Apitally SDKs mask common sensitive query parameters, headers and request/response body fields on the client side using the default patterns (regular expressions) below. These default patterns are case-insensitive and match anywhere within the name. You can add additional patterns using the configuration options in each section.

Query parameters

You can add additional patterns via the mask_query_params option.

Headers

You can add additional patterns via the mask_headers option.

Body fields

The following patterns apply to string-valued fields in JSON request and response bodies.
You can add additional patterns via the mask_body_fields option. For more granular control you can also specify callback functions via mask_request_body and mask_response_body.

Application logs

You can mask application log messages using the mask_log_record callback. See the SDK reference for Python, JavaScript, Go or .NET.

Data filtering

You can exclude selected requests from request logs, along with their associated traces and application logs. Exclusions can be based on the request path or custom conditions using sampling callbacks. The SDK applies these exclusions within your application before sending data to Apitally. Request metrics are still collected for excluded requests. See the SDK reference for Python, JavaScript, Go or .NET.

Data transit

Apitally uses HTTPS and TLS to send data from your application, running the Apitally SDK, to our servers.

Data storage

Apitally stores data in a ClickHouse database hosted on DigitalOcean in the US. The underlying block storage volume is encrypted at rest. Database backups are created hourly and are stored in a private Spaces bucket. Data in Spaces is also encrypted at rest.

Data retention

Apitally retains aggregated request metrics for 13 months, allowing you to analyze long-term trends. CPU utilization, memory usage and uptime monitoring data are retained for 32 days. Request logs, application logs and traces are retained for 15 days by default, with longer retention available on request. When an app is deleted in the Apitally dashboard, all associated data is deleted from the database, but is still included in previously created backups. Database backups are kept for 7 days.

Compliance

Apitally currently doesn’t hold certifications like SOC 2 or ISO 27001, and is not HIPAA compliant yet. Please reach out if you need help documenting Apitally as a vendor for your own compliance requirements.