Why do observation lookups with the v3 SDK return 404?
What's happening
The v4 data model only has observations — traces don't exist as a separate entity, so a trace's metadata needs to be represented as an observation. Langfuse does this by dual-writing a synthetic observation with id t-<traceId> whenever a trace comes in through the v3 ingestion path. That synthetic row lives in the events table (v4), not in the classic observations table (v3).
When you add the trace to a dataset from the Fast (v4) UI, it stamps that synthetic id into source_observation_id. Looking the id up later with the v3 SDK defaults to the v3 table, which doesn't have the synthetic row — so it 404s.
Solution
Two options, pick whichever fits your situation:
1. Stay on v3 SDK, add a query parameter
Pass useEventsTable=true on the call so the server reads from the events table where the synthetic row lives:
langfuse.api.observations.get(
observation_id,
request_options={"additional_query_parameters": {"useEventsTable": "true"}},
)2. Migrate to v4 SDKs
Python SDK v4 and JS/TS SDK v5 use the v4 data model natively — the useEventsTable flag is implicit and no workaround is needed.