Analytics
Langfuse
API integration
Ship Analytics features without building the integration. Full Langfuse API access via Proxy and 100+ MCP-ready tools for AI agents — extend models and mappings to fit your product.
Talk to usUse Cases
Why integrate with Langfuse
Common scenarios for SaaS companies building Langfuse integrations for their customers.
Embed LLM observability into AI-powered SaaS products
Let your enterprise customers pipe traces, spans, and token costs from your AI features directly into their own Langfuse workspace. This gives them auditability over what your AI is doing on their behalf without you building a bespoke observability layer.
Ship AI evaluation and guardrails as a native add-on
If your product runs hallucination checks, PII scans, or quality evaluations, write scores and comments back into your users' Langfuse traces. Their engineers see your findings in the tool they already use to monitor production LLM behavior.
Power human-in-the-loop labeling workflows
Data-labeling and RLHF platforms can pull items from Langfuse annotation queues, route them to human reviewers, and push corrected input/expected-output pairs back as dataset items ready for fine-tuning.
Sync prompts between your CMS and Langfuse
Prompt management tools and internal developer platforms can push versioned prompts into Langfuse and promote them across environments via labels, keeping a single source of truth for prompt engineering teams.
Offer dataset-driven experiment automation
Testing and QA platforms can create Langfuse datasets, trigger dataset runs, and read back experiment results, enabling your users to run regression tests against their live prompts and models from inside your product.
What You Can Build
Ship these features with Truto + Langfuse
Concrete product features your team can ship faster by leveraging Truto’s Langfuse integration instead of building from scratch.
OpenTelemetry trace forwarding
Stream every LLM call, tool invocation, and span from your platform into your customer's Langfuse project using the OTEL ingestion endpoint.
Automated score writeback
Attach numeric or categorical evaluation scores (accuracy, toxicity, safety) to specific traces so your assessments appear on Langfuse dashboards alongside native metrics.
Annotation queue reviewer app
Fetch pending items from Langfuse annotation queues, present them in your labeling UI, and update or delete queue items as reviewers work through the backlog.
Dataset generator from reviewed traces
Convert human-corrected outputs into structured Langfuse dataset items, ready to power the next fine-tuning or evaluation run.
Two-way prompt registry sync
Create, list, and version prompts in Langfuse from your CMS, then use bulk update to promote versions between staging and production labels.
Trace-level comment injection
Programmatically leave contextual comments on traces (e.g., 'PII detected in output') so your product's insights show up inline in the customer's Langfuse UI.
SuperAI
Langfuse AI agent tools
Comprehensive AI agent toolset with fine-grained control. Integrates with MCP clients like Cursor and Claude, or frameworks like LangChain.
list_all_langfuse_public_annotation_queues
List all annotation queues in Langfuse. Returns a list of queues, each with id and upstream-defined fields in attributes. Truto handles pagination.
create_a_langfuse_public_annotation_queue
Create an annotation queue in Langfuse. Returns the created queue with id. Requires a JSON request body. Required: name, scoreConfigIds.
get_single_langfuse_public_annotation_queue_by_id
Get a single Langfuse annotation queue by id. Returns the queue with id. Required: id.
list_all_langfuse_annotation_queue_items
List items in a langfuse annotation queue. Returns each item's id and upstream-defined fields. Optional: status. Required: queue_id.
create_a_langfuse_annotation_queue_item
Add an item to a langfuse annotation queue. Returns the created item with its id and upstream-defined fields. Required: queue_id, objectId, objectType.
get_single_langfuse_annotation_queue_item_by_id
Get a specific langfuse annotation queue item by id. Returns the item's id and upstream-defined fields. Required: id, queue_id.
update_a_langfuse_annotation_queue_item_by_id
Update a langfuse annotation queue item. Returns the item's id and upstream-defined fields. Required: id, queue_id.
delete_a_langfuse_annotation_queue_item_by_id
Remove an item from a Langfuse annotation queue. Returns an empty 204 response on success. Required: id, queue_id.
create_a_langfuse_annotation_queue_assignment
Assign a user to a Langfuse annotation queue. Returns the created assignment with its id, queue id, and user id. Required: queue_id, userId.
langfuse_annotation_queue_assignments_bulk_delete
Remove a user's assignment from a Langfuse annotation queue. Returns an empty 204 response on success. Required: queue_id, userId.
list_all_langfuse_integrations_blob_storages
List all blob storage integrations for the Langfuse organization. Returns: id, projectId, type, bucketName, endpoint, region, accessKeyId, prefix, exportFrequency, enabled, forcePathStyle, fileType, exportMode, exportStartDate, compressed, exportSource, exportFieldGroups, nextSyncAt, lastSyncAt, lastError, lastErrorAt, createdAt, updatedAt.
get_single_langfuse_integrations_blob_storage_by_id
Get the sync status of a Langfuse blob storage integration by id. Returns: id, projectId, enabled. Required: id.
delete_a_langfuse_integrations_blob_storage_by_id
Delete a Langfuse blob storage integration by id. Returns an empty 204 response on success. Required: id.
langfuse_integrations_blob_storages_bulk_update
Create or update a Langfuse blob storage integration for a project by sending a provider-specific configuration payload. The call performs a test upload to validate the bucket. Returns: id, projectId, type, endpoint, region, prefix, enabled, compressed, createdAt, updatedAt. Required: projectId, type, bucketName, region, exportFrequency, enabled, forcePathStyle, fileType, exportMode.
list_all_langfuse_public_comments
List comments in Langfuse, optionally filtered by objectType, objectId, or authorUserId. Returns paginated comment records including id and upstream-defined comment attributes.
create_a_langfuse_public_comment
Create a comment attached to a Langfuse object (trace, observation, session, or prompt). Returns the created comment including id and upstream-defined comment attributes. Requires the request body defined by the upstream CreateCommentRequest schema. Required: projectId, objectType, objectId, content.
get_single_langfuse_public_comment_by_id
Get a single Langfuse comment by id. Returns the comment including id and upstream-defined comment attributes. Required: id.
list_all_langfuse_public_dataset_items
List dataset items in Langfuse. Returns: id, status, input, expectedOutput, metadata, sourceTraceId, sourceObservationId, datasetId, datasetName, createdAt, updatedAt, mediaReferences. Requires datasetName when version is provided.
create_a_langfuse_public_dataset_item
Create a dataset item in Langfuse. Returns: id, status, input, metadata, createdAt, updatedAt. Required: datasetName.
get_single_langfuse_public_dataset_item_by_id
Get a Langfuse dataset item by id. Returns: id, status, input, metadata, createdAt, updatedAt. Required: id.
delete_a_langfuse_public_dataset_item_by_id
Delete a Langfuse dataset item and all its run items. Returns an empty 204 response on success. Required: id.
list_all_langfuse_public_dataset_run_items
List dataset run items in langfuse. Returns a paginated list of run items for the specified dataset and run. Required: dataset_id, run_name.
create_a_langfuse_public_dataset_run_item
Create a dataset run item in langfuse. Returns the created run item with its id and schema-specific attributes. Required: runName, datasetItemId.
list_all_langfuse_public_datasets
Get all datasets. Returns: id, name, description, metadata, inputSchema, expectedOutputSchema, projectId, createdAt.
create_a_langfuse_public_dataset
Create a dataset. Returns: id, name, description, metadata, inputSchema, expectedOutputSchema, projectId, createdAt. Required: name.
get_single_langfuse_public_dataset_by_id
Get a dataset. Returns: id, name, description, metadata, inputSchema, expectedOutputSchema, projectId, createdAt. Required: dataset_name.
get_single_langfuse_dataset_run_by_id
Get a dataset run in Langfuse by id and return its run items. Returns an array of objects with id, name, description, metadata, datasetId, datasetName, createdAt, and updatedAt. Required: id, dataset_name.
delete_a_langfuse_dataset_run_by_id
Delete a dataset run in Langfuse and all its run items. This action is irreversible. Returns the delete confirmation response. Required: id, dataset_name.
list_all_langfuse_dataset_runs
List dataset runs in Langfuse for a dataset. Returns a list of runs, each including: id, created_at, updated_at. Required: dataset_name.
list_all_langfuse_public_experiments
List experiments in Langfuse. Returns experiment records including id, name, datasetId, metadata, and scores. Use `fields` to request `metadata` and `scores` in addition to the default `core` group. Required: from_start_time.
list_all_langfuse_public_experiment_items
List Langfuse experiment items with cursor-based pagination, ordered by start time descending. Returns each item with id, traceId, startTime, endTime, experimentId, experimentName, and experimentItemId, plus optional field-group-specific fields for dataset, io, metadata, itemMetadata, experimentMetadata, and scores. Required: from_start_time.
list_all_langfuse_public_healths
Check the health of the Langfuse API and database. Returns the health status response.
create_a_langfuse_public_ingestion
Batch ingest tracing events into Langfuse. Returns a 207 ingestion response including a list of encountered errors. Deprecated in favor of the OpenTelemetry endpoint; max batch size 3.5 MB. Required: batch.
list_all_langfuse_public_metrics_v_2
List aggregated metrics from a Langfuse project via the v2 Metrics API. Returns the query-dependent metrics result object. Required: query.
get_single_langfuse_public_observation_by_id
Get a single langfuse observation (event, span, or generation) by id. Returns the observation record including id, traceId, type, name, startTime, endTime, usageDetails, and costDetails. Required: id.
list_all_langfuse_public_observations
List observations in Langfuse with optional filtering by type, level, trace, environment, and start time. Returns observation records including id, traceId, type, name, and metadata. Legacy v1 endpoint; consider the v2 endpoint for cursor-based pagination.
list_all_langfuse_public_observations_v_2
List observations in a Langfuse project using the Observations API v2. Returns each observation's id, traceId, type, start/end times, model, usage, cost, and metadata. Supports filters such as traceId, type, level, environment, and start-time range, plus field groups (`fields`) and cursor-based pagination.
create_a_langfuse_public_score
Create a score in Langfuse. Supports both trace and session scores. Required: name, value.
delete_a_langfuse_public_score_by_id
Delete a Langfuse score by id. Returns an empty 204 response on success. Required: id.
list_all_langfuse_public_scores
List scores in Langfuse. Returns a polymorphic value field (NUMERIC→number, BOOLEAN→boolean, CATEGORICAL/TEXT/CORRECTION→string) with core fields id, projectId, name, dataType, source, timestamp, environment, createdAt, and updatedAt.
list_all_langfuse_public_scores_v_2
List deprecated Langfuse v2 scores (trace and session scores). Returns a score record including id, projectId, name, value, dataType, source, timestamp, environment, createdAt, and updatedAt. Deprecated: use GET /api/public/v3/scores instead; not available on Langfuse v4 and later.
get_single_langfuse_public_scores_v_2_by_id
Get a deprecated Langfuse v2 score by id. Returns the score including id, projectId, name, value, dataType, source, timestamp, environment, createdAt, and updatedAt. Deprecated: use GET /api/public/v3/scores with the id filter; not available on Langfuse v4 and later. Required: id.
list_all_langfuse_public_llm_connections
List all LLM connections in the authenticated Langfuse project. Returns connection records including id and adapter-specific attributes.
delete_a_langfuse_public_llm_connection_by_id
Delete a Langfuse LLM connection by id. Evaluators that depend on the deleted connection are automatically paused. Returns the deletion response including id and operation-specific attributes. Required: id.
langfuse_public_llm_connections_bulk_update
Create or update a Langfuse LLM connection. The connection is upserted on provider. Returns the upserted connection object including id and adapter-specific attributes. Required: provider, adapter, secretKey.
get_single_langfuse_public_media_by_id
Get a langfuse media record by id. Returns: url. Required: id.
update_a_langfuse_public_media_by_id
Patch a langfuse media record by id. Returns an empty 204 response on success. Required: id, uploadedAt, uploadHttpStatus.
create_a_langfuse_public_media
Get a presigned upload URL for a langfuse media record. Returns: url. Requires a request body. Required: contentType, contentLength, sha256Hash, field.
list_all_langfuse_public_models
List models in Langfuse. Returns each model record with its id and upstream model-specific attributes.
create_a_langfuse_public_model
Create a model in Langfuse by posting a JSON request body. Returns the created model record with its id and upstream model-specific attributes. Required: modelName, matchPattern.
get_single_langfuse_public_model_by_id
Get a single Langfuse model by id. Returns the model object including its id, modelName, and project-specific pricing fields. Required: id.
delete_a_langfuse_public_model_by_id
Delete a Langfuse model by id. Cannot delete Langfuse-managed models; create a custom definition with the same modelName to override instead. Returns an empty 204 response on success. Required: id.
create_a_langfuse_otel_trace
Ingest OpenTelemetry traces into Langfuse via the OTLP/HTTP trace export endpoint. Returns an OTLP export response with partial success summary. Required: resourceSpans.
list_all_langfuse_organizations_memberships
List all organization memberships in Langfuse. Returns a list of membership records, each including id and attributes.
langfuse_organizations_memberships_bulk_update
Create or update an organization membership in Langfuse. Returns the membership record including id and attributes. Requires a JSON request body. Required: userId, role.
langfuse_organizations_memberships_bulk_delete
Delete an organization membership from Langfuse. Returns the deletion response including id and attributes. Requires a JSON request body. Required: userId.
list_all_langfuse_project_memberships
List all memberships for a langfuse project. Returns a list of membership records including id, created_at, and updated_at. Required: project_id.
langfuse_project_memberships_bulk_update
Create or update a langfuse project membership. Returns the membership record including id and schema-specific attributes. The user must already be a member of the organization. Required: project_id, userId, role.
langfuse_project_memberships_bulk_delete
Delete a membership from a langfuse project. Returns the deletion response including id and schema-specific attributes. The user must be a member of the organization. Required: project_id, userId.
list_all_langfuse_organizations_projects
List all projects for the organization associated with the API key in langfuse. Returns project objects, each including id and upstream-defined attributes. Requires an organization-scoped API key.
list_all_langfuse_organizations_api_keys
List all API keys for the Langfuse organization associated with the API key. Returns: id, attributes.
list_all_langfuse_public_projects
Get the Langfuse project associated with the API key. Returns the project object including id, name, createdAt, and updatedAt.
create_a_langfuse_public_project
Create a new Langfuse project. Returns the created project including id, name, metadata, and retention. Required: name, retention.
update_a_langfuse_public_project_by_id
Update an existing Langfuse project by id. Returns the updated project including id, name, metadata, and retention. Required: id, name.
delete_a_langfuse_public_project_by_id
Delete a Langfuse project by id. Returns the project deletion response with upstream-defined fields. Project deletion is processed asynchronously. Required: id.
list_all_langfuse_project_api_keys
List all API keys for a Langfuse project. Returns the API key objects including their id and upstream-defined attributes. Required: project_id.
create_a_langfuse_project_api_key
Create a new Langfuse project API key. Returns the created API key object including its id and upstream-defined attributes. publicKey and secretKey must be provided together. Required: project_id.
delete_a_langfuse_project_api_key_by_id
Delete a Langfuse project API key by id. Returns the deletion result including id and upstream-defined attributes. Required: id, project_id.
langfuse_prompt_versions_bulk_update
Update the labels for a specific Langfuse prompt version. Returns the updated prompt with id, name, version, projectId, labels, prompt, type, config, commitMessage, tags, createdAt, and updatedAt. Required: name, version, newLabels.
list_all_langfuse_public_prompts
List langfuse prompt names with their versions and labels. Returns an array of prompt metadata records. Optional filters: name, label, tag, from_updated_at, to_updated_at.
create_a_langfuse_public_prompt
Create a new version for a langfuse prompt. Returns the created prompt object.
get_single_langfuse_public_prompt_by_id
Get a single langfuse prompt by prompt name. Returns the prompt object. Optional: version, label, resolve. Required: prompt_name.
langfuse_public_prompts_bulk_delete
Delete langfuse prompt versions by prompt name. If neither version nor label is specified, all versions of the prompt are deleted. Required: prompt_name.
list_all_langfuse_scim_service_provider_configs
Get the SCIM Service Provider Configuration for a Langfuse organization. Returns the SCIM ServiceProviderConfig object including its identifier and SCIM-defined capability attributes.
list_all_langfuse_scim_resource_types
List SCIM Resource Types in Langfuse. Returns a list of resource type entries, each containing id and attributes (SCIM-defined fields).
list_all_langfuse_scim_schemas
List SCIM schemas in Langfuse. Returns the registered schemas with their ids, names, and attribute definitions.
list_all_langfuse_scim_users
List SCIM users in the langfuse organization. Returns the SCIM list response. Supports optional filter, startIndex, and count parameters.
create_a_langfuse_scim_user
Create a new SCIM user in the langfuse organization. Returns the created SCIM user object. Required: userName, name.
get_single_langfuse_scim_user_by_id
Get a specific langfuse SCIM user by id. Returns the SCIM user object. Required: id.
delete_a_langfuse_scim_user_by_id
Remove a SCIM user from the langfuse organization by id. This removes the user from the organization but does not delete the user entity itself. Returns an empty 204 response on success. Required: id.
list_all_langfuse_public_score_configs
List all Langfuse score configs. Returns a paginated list of score configs, each including id and upstream schema-defined attributes.
create_a_langfuse_public_score_config
Create a Langfuse score config with a JSON request body. Returns the created score config including id and upstream schema-defined attributes. Required: name, dataType.
get_single_langfuse_public_score_config_by_id
Get a Langfuse score config by id. Returns the score config including id and upstream schema-defined attributes. Required: id.
update_a_langfuse_public_score_config_by_id
Update a Langfuse score config by id with a JSON request body. Returns the updated score config including id and upstream schema-defined attributes. Required: id.
list_all_langfuse_public_sessions
List langfuse sessions. Returns a paginated list of session objects including id and content-type-specific attributes. Optional: fromTimestamp, toTimestamp, environment. Legacy endpoint; prefer v2 observations for new data extraction workflows.
get_single_langfuse_public_session_by_id
Get a Langfuse session by id. Returns the session object including its id and traces. Traces are not paginated; prefer the v2 observations endpoint for large sessions. Required: id.
get_single_langfuse_public_trace_by_id
Get a specific Langfuse trace by id. Returns the trace object including id, name, timestamp, input, output, metadata, scores, observations, and metrics such as totalCost and latency. Optional: fields. Required: id.
delete_a_langfuse_public_trace_by_id
Delete a specific Langfuse trace by id. Returns the upstream deletion response in `attributes`. Required: id.
list_all_langfuse_public_traces
List Langfuse traces in a project. Returns each trace with id, name, timestamp, userId, sessionId, tags, and aggregated metrics. Optional filters: userId, name, sessionId, tags, version, release, environment, fromTimestamp, toTimestamp, and a JSON filter string.
langfuse_public_traces_bulk_delete
Delete multiple Langfuse traces at once. Returns a 200 confirmation response. Avoid sending more than 30–50 trace IDs in a single request. Required: traceIds.
create_a_langfuse_unstable_dashboard_widget
Create a reusable dashboard widget in Langfuse. Returns the created widget including id, view, and minVersion. Widgets must be placed on a dashboard grid via the UI; the legacy traces view is rejected. Unstable API: may evolve.
list_all_langfuse_unstable_evaluation_rules
List evaluation rules in the authenticated Langfuse project. Returns each rule's id, name, target, enabled state, evaluator, filter, mapping, and timestamps.
create_a_langfuse_unstable_evaluation_rule
Create an evaluation rule in Langfuse. Returns the created rule with id, name, target, enabled, evaluator, filter, mapping, and timestamps. Required: name, target, and evaluator (with name and scope). Target must be observation or experiment; omit mapping for code evaluators; at most 50 active rules per project.
get_single_langfuse_unstable_evaluation_rule_by_id
Get a single Langfuse evaluation rule by id. Returns the rule including id, name, target, enabled, evaluator, filter, mapping, and timestamps. Required: id.
update_a_langfuse_unstable_evaluation_rule_by_id
Update a Langfuse evaluation rule by id. Returns the updated rule including its id, name, target, evaluator, filter, mapping, and enabled state. Required: id. Provide only the fields you want to change.
delete_a_langfuse_unstable_evaluation_rule_by_id
Delete a Langfuse evaluation rule by id. Returns the deletion result object. Required: id. Note: this removes the live-ingestion rule only and does not delete the referenced evaluator.
list_all_langfuse_unstable_evaluators
List evaluators available to the authenticated Langfuse project. Returns the latest version of each evaluator, including id, name, scope, version, variables, outputDefinition, and modelConfig. Project and Langfuse-managed evaluators may share a name but appear as separate items with different scope values.
create_a_langfuse_unstable_evaluator
Create an evaluator in Langfuse. Returns the created evaluator including id, name, scope, version, variables, outputDefinition, and modelConfig. Required: name. For `llm_as_judge` evaluators, send `type` and `outputDefinition`; for `code` evaluators, send `type`, `sourceCode`, and `runtime`.
get_single_langfuse_unstable_evaluator_by_id
Get a single Langfuse evaluator by id. Returns the evaluator including id, name, version, scope, type, prompt, outputDefinition, modelConfig, and variables. Required: id.
delete_a_langfuse_unstable_evaluator_by_id
Delete a Langfuse evaluator by id. Removes the evaluator and all its stored versions; existing scores are not deleted. Returns the deletion response with id and attributes. Required: id. Cannot delete managed evaluators (scope=managed); delete referencing evaluation rules first to avoid 409.
Why Truto
Why use Truto’s MCP server for Langfuse
Other MCP servers give you a static tool list for one app. Truto gives you a managed, multi-tenant MCP infrastructure across 600+ integrations.
Auto-generated, always up to date
Tools are dynamically generated from curated documentation — not hand-coded. As integrations evolve, tools stay current without manual maintenance.
Fine-grained access control
Scope each MCP server to read-only, write-only, specific methods, or tagged tool groups. Expose only what your AI agent needs — nothing more.
Multi-tenant by design
Each MCP server is scoped to a single connected account with its own credentials. The URL itself is the auth token — no shared secrets, no credential leaking across tenants.
Works with every MCP client
Standard JSON-RPC 2.0 protocol. Paste the URL into Claude, ChatGPT, Cursor, or any MCP-compatible agent framework — tools are discovered automatically.
Built-in auth, rate limits, and error handling
Tool calls execute through Truto’s proxy layer with automatic OAuth refresh, rate-limit handling, and normalized error responses. No raw API plumbing in your agent.
Expiring and auditable servers
Create time-limited MCP servers for contractors or automated workflows. Optional dual-auth requires both the URL and a Truto API token for high-security environments.
How It Works
From zero to integrated
Go live with Langfuse in under an hour. No boilerplate, no maintenance burden.
Link your customer’s Langfuse account
Use Truto’s frontend SDK to connect your customer’s Langfuse account. We handle all OAuth and API key flows — you don’t need to create the OAuth app.
We handle authentication
Don’t spend time refreshing access tokens or figuring out secure storage. We handle it and inject credentials into every API request.
Call our API, we call Langfuse
Truto’s Proxy API is a 1-to-1 mapping of the Langfuse API. You call us, we call Langfuse, and pass the response back in the same cycle.
Unified response format
Every response follows a single format across all integrations. We translate Langfuse’s pagination into unified cursor-based pagination. Data is always in the result attribute.
FAQs
Common questions about Langfuse on Truto
Authentication, rate limits, data freshness, and everything else you need to know before you integrate.
How do end users authenticate their Langfuse account with our product?
Langfuse uses project-scoped API key pairs (public and secret key). Through Truto, your users provide these credentials once during connection setup, and Truto securely stores and injects them into every API call — you never handle raw keys.
Can we send traces via OpenTelemetry through Truto?
Yes. The create_a_langfuse_otel_trace tool accepts OTEL-formatted spans, and create_a_langfuse_public_ingestion supports Langfuse's native batched JSON format. Both are suitable for high-volume asynchronous telemetry push.
Which resources support full CRUD versus read-only access?
Traces, observations, sessions, and metrics are primarily read-only or ingestion-based. Prompts, datasets, dataset items, scores, annotation queues, annotation queue items, score configs, evaluators, and evaluation rules support create, read, update, and/or delete operations depending on the resource.
Does Truto handle pagination when listing large volumes of traces or observations?
Yes. Truto normalizes Langfuse's pagination so list endpoints like list_all_langfuse_public_traces and list_all_langfuse_public_observations_v_2 can be iterated consistently without you handling cursors or page tokens manually.
Can we support customers using self-hosted Langfuse instances?
Langfuse is open source and commonly self-hosted. Truto supports configuring a custom base URL per connection, so your enterprise users can point the integration at their own Langfuse deployment rather than Langfuse Cloud.
Is bulk deletion or bulk update supported for cleanup workflows?
Yes. Langfuse exposes bulk endpoints for traces, prompts, annotation queue assignments, LLM connections, blob storage integrations, and organization/project memberships, which Truto exposes as dedicated bulk tools for efficient batch operations.
Langfuse
Get Langfuse integrated into your app
Our team understands what it takes to make a Langfuse integration successful. A short, crisp 30 minute call with folks who understand the problem.