Skip to main content

Migrating from the transactions and discover API datasets

Learn how to update Sentry API queries to use the spans and errors datasets.
Sentry is retiring the transactions, discover and metricsEnhanced datasets from API queries. Migrate by November 30, 2026. After that date, these datasets will no longer be available through the API. Your data isn't being deleted, and this change doesn't affect the Sentry UI or your SDK setup. It affects only direct API requests, including scripts and third-party integrations.
​

What's changing?

These endpoints let you choose a dataset:

Requests that use dataset=transactions, dataset=discover or dataset=metricsEnhanced need to change.
For replay counts, change data_source=transactions to data_source=spans, and data_source=discover to data_source=errors.
​If your request doesn't set a dataset, it's affected. These endpoints default to discover. Set dataset=spans or dataset=errors explicitly. For replay counts, set data_source explicitly.
​

How do I migrate?

For most performance queries:
​

  1. Change dataset=transactions (or metricsEnhanced) to dataset=spans.

  2. Add is_transaction:true to your query. Without it you get all spans, not only transactions.

  3. Update fields and functions using the list below.

If you query errors, use dataset=errors. If you used discover to query both errors and transactions, split it into one request for errors and one for spans, then combine the results in your application.
​

Field and function changes

Filters

  • event.type:transaction → is_transaction:true

Fields

  • transaction.duration or duration → span.duration

  • exclusive_time → span.self_time

  • transaction.status → trace.status

  • http.method → transaction.method

  • url or http.url → request.url

  • title → transaction

  • platform.name → platform

  • span.module → span.category

  • geo.city, geo.country_code, geo.region, geo.subdivision, geo.subregion → user.geo.city, user.geo.country_code, user.geo.region, user.geo.subdivision, user.geo.subregion

  • timestamp.to_day or timestamp.to_hour → timestamp

  • Custom measurements → tags[<measurement_name>,number]

Functions

  • count() → count(span.duration)

  • spm() → epm()

  • percentile(transaction.duration,0.95) → p95(span.duration). Supported: p50, p75, p90, p95, p99, p100.

  • apdex() → apdex(span.duration,300) (use your own threshold)

  • user_misery() → user_misery(span.duration,300) (use your own threshold)

The spans dataset doesn't support these, so remove them: any(), count_miserable(), count_web_vitals(), last_seen(), linear_regression(), corr(), and anything using total.count.
For every field you can query, see Searchable span properties.
​

FAQ

Is my transaction data being deleted? No. Query transaction spans with dataset=spans and is_transaction:true. [Confirm]
​

Do I need to change my Sentry SDK? No. This change affects only API requests. Your SDK keeps sending data the same way.
​

Can I still filter or group by transaction? Yes. transaction is still an attribute on spans.
​

Why do counts differ in the spans dataset? The spans dataset adjusts counts for sampling to estimate total volume. The legacy transactions dataset counted stored events, so results may differ. To get raw sampled values from /events-timeseries/, add disableAggregateExtrapolation=1. Learn more about extrapolation.
​

I didn't receive an email. Am I still affected? Possibly. Check any scripts or integrations that call the endpoints above, including requests that don't set a dataset.
​

What if my request stops working after the deadline? Check that it explicitly uses dataset=spans or dataset=errors, and that transaction queries include is_transaction:true. For replay counts, check that data_source is set to spans or errors. If you still need help, contact Sentry Support and include the request with your auth token removed.
​

Timeline

  • October 14, 2026: Email sent to affected organizations.

  • November 30, 2026: API cutoff for the transactions, discover and metricsEnhanced datasets.

Related articles

Did this answer your question?