Skip to main content
Fiddler enables you to delete previously published production inference data by unique identifier or by event timestamp, using either the Python client’s Model.delete_events() method or the Delete Events REST API.
Deleting events with the Python client requires fiddler-client 3.13.0 or later. On earlier client versions, use the REST API directly. See the Python SDK changelog for release details.
Common reasons for deletion include:
  • Complying with data privacy regulations (GDPR, CCPA, etc.)
  • Removing erroneously published data
  • Correcting data inaccuracies

Deletion Methods

Fiddler supports two filtering methods for deletion (only one method can be used per request):

Delete by Event ID

Delete specific inference events by providing their unique identifiers. The event ID corresponds to the event_id_col specified during Model onboarding.
Event IDs are designed to be unique. If duplicate event_id values have been published, deleting by event ID will remove all events matching those IDs from the raw events table. Aggregated metrics are not recalculated for event ID-based deletions — requests that combine event_ids with update_metrics=True are rejected. See event deduplication for avoiding duplicate events. You can delete up to 10,000 events per request. If you need to delete more events in one request, please contact Fiddler support.

Delete by Timestamp Range

Delete events that fall within a designated time range by specifying start and end timestamps. The filtering is based on the timestamp column (event_ts_col) defined during Model onboarding. Deletions are processed in batches (default batch size: 100K events) to ensure efficiency and resilience. Both timestamps must be aligned to hour boundaries (for example, 2025-11-17T01:00:00Z), and the range applies as start_time ≤ t < end_time.
Ensure that the max_memory_usage setting in ClickHouse is configured to handle the number of events specified by the batch size (controlled by the EVENT_DELETION_BATCH_SIZE environment variable). You can delete up to 100 million events per day using this endpoint. If you require a higher daily deletion limit, please contact Fiddler support.

Impact on Monitoring Metrics

When deleting inference data with the time range filter, you can control how the deletion affects your monitoring metrics using the update_metrics parameter:
  • Preserve existing aggregated metrics (default): update_metrics=False
  • Recalculate metrics to reflect the data removal: update_metrics=True
update_metrics applies only to time range deletions. Event ID-based deletions do not recalculate aggregated metrics, and requests that set update_metrics=True together with event_ids are rejected.

Important Considerations

  • Deletions are permanent and cannot be undone
  • Pre-production (baseline) datasets do not support row-level deletion
  • Large-scale deletions may temporarily impact data ingestion performance.
  • By default, the event deletion API allows up to 30 requests per day.
  • If the rate limit is exceeded, the API will return a 429 Too Many Requests response, along with rate limiting headers:
    • X-RateLimit-Limit – The maximum number of allowed requests in the current window.
    • X-RateLimit-Remaining – The number of remaining requests in the current window.
    • Retry-After – The number of seconds to wait before retrying, or the HTTP date when the rate limit resets.
    • X-RateLimit-Reset – The UTC epoch time (seconds) when the current rate limiting window resets.

Deleting Events with the Python Client

Use Model.delete_events() to delete events directly from the Python client (fiddler-client 3.13.0+). Deletion runs asynchronously on the server: the method returns a Job you can wait on or poll for completion.

Example: Deleting Events by Timestamp Range

import fiddler as fdl

project = fdl.Project.from_name(name='your_project_name')
model = fdl.Model.from_name(name='your_model_name', project_id=project.id)

# Delete one hour of events. Timestamps must be timezone-aware (an ISO 8601
# string with an explicit offset, or a timezone-aware datetime) and aligned
# to hour boundaries. The range applies as start_time <= t < end_time.
job = model.delete_events(
    start_time='2025-11-17T01:00:00Z',
    end_time='2025-11-17T02:00:00Z',
    update_metrics=True,  # Recalculate monitoring metrics after deletion
)
job.wait()

Example: Deleting Events by Event ID

import fiddler as fdl

project = fdl.Project.from_name(name='your_project_name')
model = fdl.Model.from_name(name='your_model_name', project_id=project.id)

# Delete specific events by ID (up to 10,000 IDs per request).
job = model.delete_events(event_ids=['pred_001', 'pred_002'])
job.wait()
Validation to be aware of:
  • Provide either a time range or a list of event IDs in a single request — not both.
  • start_time and end_time must be provided together. Naive datetimes (without timezone information) are rejected; non-UTC values are normalized to UTC.
  • A call with no filter is rejected, to avoid accidentally deleting all events for a model.

Deleting Events with the REST API

The Delete Events REST API (DELETE /v3/events) accepts the following parameters:
ParameterTypeDefaultDescription
model_idUUID-Unique identifier for the model from which production events are deleted.
time_rangeOptional[dict]-Dictionary with start_time (inclusive) and end_time (exclusive) in UTC, both aligned to the hour (format: 'YYYY-MM-DD HH:00:00'). Specify timestamps so that the entire range covers complete hours—do not use minutes or seconds. The range filter applies as start_time ≤ t < end_time.
event_idsOptional[list]-List of event_ids to be deleted.
update_metricsOptional[bool]FalseDetermines if the monitoring metrics are recalculated to reflect the changes. Supported for time range deletions only.

Example: Deleting Inference Events by Timestamp Range

import requests
headers = {'Content-Type': 'application/json', 'Authorization': f'Bearer {token}'}
data = {'model_id': model.id,
        'time_range':{
            'start_time':'2024-09-27 17:00:00',
            'end_time':'2024-09-27 18:00:00',
            },
        'update_metrics':True,
        }
response = requests.delete(
    url=f'{url}/v3/events',
    headers=headers,
    json=data,
)

Example: Deleting Inference Events by Event IDs

import requests
headers = {'Content-Type': 'application/json', 'Authorization': f'Bearer {token}'}
data = {
         'model_id': model.id,
         'event_ids': ['event_id1', 'event_id2'],
      }
response = requests.delete(
  url=f'{url}/v3/events',
  headers=headers,
  json=data,
)

📘 Please delete events with caution when update_metrics=True. We recommend not deleting events while there is an ongoing publish or update operation within the same data range.