Custom tool follows documented config exactly (POST + parameters schema + query_params) but the real outgoing request still arrives completely empty every time

TONEXT AI
Latest agent_id: agent_eb13a21c7dd6a5f0718d9bd02d

Problem: A custom tool (check_availability) is configured exactly per your docs at docs.retellai.com/build/single-multi-prompt/custom-function:

  • method: "POST"
  • date declared in the parameters schema with a description (so the LLM determines it)
  • static values (client_id, calendar_id, user_id) in query_params
  • args_at_root: true, parameter_type: "json"

On every real call, our webhook receives a request with NONE of this attached — no query string, no body (confirmed via raw request headers on our end — no query string, no content-type, no content-length) — even though your own call logs show the LLM correctly deciding a value for date (e.g. {“date”: “2026-08-29”}) right before the tool call fails.

Example failing call to check directly in your logs:

  • call_id: call_622ea01f4cd3516887f2404cdce
  • Timestamp: 2026-08-28 22:47:17 EDT (llm decided the tool call, per your own call log: Calling tool: check_availability Arguments: {"date": "2026-08-29", ...}) → 22:47:18 EDT (our server responded 400 because the request arrived empty)
  • Several other call_ids from the same session show identical behavior if you need more samples: call_631b08619f7bdd6b598434e5072, call_728dfa3d05c58b5e3c229cb30b7, call_b87bc2f034bb4596b882bc46c38, call_f36e28003cbad3f61bdf44fc6f3

What we’ve already confirmed directly from your own API (GET /get-retell-llm/{id}):

  • The tool’s stored query_parameters field (note: we send query_params per your docs, but a read-back shows it stored under query_parameters instead — a naming discrepancy between the write and read schema you may want to check) IS correctly populated with our static values (client_id, calendar_id, user_id all present and correct).
  • We tried this both with method GET and POST — GET makes sense as broken since query params are documented as static-only and there’d be no channel left for the LLM’s own argument, but POST (with the parameters schema + args_at_root + parameter_type set as documented) also produced an identical empty request.

What we need from support: please check these call_ids against your own server-side execution logs — we’ve followed the documented mechanism exactly and the stored tool config is confirmed correct on our end via your own API, so at this point we need someone who can see what Retell’s backend actually attempted to send (or didn’t) for these specific calls, not another documentation pass.

This is blocking a live-booking feature for a multi-tenant SaaS product (each client gets an auto-provisioned agent via your API), so a fix or workaround here needs to be something we can replicate programmatically, not a one-off dashboard edit.

Thanks — happy to hop on a call if that’s faster than back-and-forth.

Hey @contact8

I have escalated your request to the relevant team. As soon as I receive any updates, I’ll let you know.

Best Regards.

Hello @contact8

We checked the example call and the current related agent configuration. The call log shows the function being called with Date set to 2026 08 31. The failure happened after that, when your endpoint returned:

HTTP 400: Missing clientId, calendarId, or date

The active Check Availability function configuration we found is still set to GET, not POST. That matters because Retell only sends a JSON body for POST, PUT, and PATCH. For GET requests, Retell does not send a JSON body, and Query Parameters are not filled by the LLM.

Best Regards.

Hi,

Thanks — that pointed us in the right direction, but we’ve now isolated something more specific with direct evidence on both sides.

What we did: confirmed via your own API that agent agent_e664cae275b1de8f60025015cd (LLM tool check_availability) has:

  • query_parameters correctly populated: client_id, calendar_id, user_id all present with correct values.
  • method still showing "GET" in the raw API response from GET /get-retell-llm/{id}.

That second part is the surprising one: our dashboard showed the method dropdown set to POST, and we published that change (agent is on version 2). But pulling the same agent’s config directly via your API shows method: "GET" — the dashboard’s displayed state doesn’t match what’s actually persisted on your backend. We were unable to get this field to actually save as POST, either via our own API calls (POST /create-retell-llm) or via the dashboard UI directly.

Separately, and more importantly:** even with query_parameters genuinely populated (confirmed above), a real test call on this exact agent (call_id call_bc1def42c5554351f62f287d129, 2026-08-31 11:48:23 EDT) hit our webhook with zero query string at all — a completely bare GET request. We log the raw incoming request URL on our end, so this is directly observed, not inferred. Your own call log for the same call shows the tool being called with a real argument ({"date": "2026-09-01", ...}), so the LLM side is working correctly — the static query_parameters your backend has stored for this tool just never made it onto the actual outgoing request.

What we need:

  1. Can you confirm why method isn’t saving as POST for this specific agent/tool, from either the API or the dashboard?
  2. Independent of that — why would correctly-stored query_parameters not be attached to a live GET request? Is there a known issue with static query parameters not being included on GET-method custom tools specifically?

Happy to share full API responses/logs for this exact agent+call if useful — everything above is reproducible on our end.

Thanks,

Urooj Maree B.
Founder · TonextAI Solutions
Virginia, USA · tonextai.com

Hey @contact8

I’ve escalated this with the team for further investigation. I’ll get back to you as soon as I have an update.

Thank You

Best Regards.

Hey @contact8

For call_bc1def42c5554351f62f287d129, the agent did call Check Availability and the LLM did provide the Date value correctly. The failure happened when the custom function request came back from your endpoint with: HTTP 400: Missing clientId, calendarId, or date

On the Method question, the version being read matters here. The LLM has multiple versions:

Version 1 still has Check Availability set to GET, with the static Query Parameters populated.

Version 2 has Check Availability set to POST, but the static Query Parameters are empty for that tool.

The call you shared used version 2 of the LLM.

That explains why you can see GET when reading one version, while the newer version has POST. The POST change did save, but the static Query Parameters were not present on Check Availability in that version.

Separately, on Query Parameters: Retell does not fill Query Parameters from LLM generated arguments. Query Parameters are applied as fixed values or Dynamic Variables. Values chosen by the LLM, like Date, should be defined in the request body Parameters. This is documented here:

The safest configuration for this tool is:

Keep Check Availability as POST.

Put Date as an LLM filled body Parameter with a clear description.

Put Client ID, Calendar ID, and User ID as constant body Parameters, or have your endpoint read them from fixed Query Parameters if you prefer that pattern.

If your endpoint expects a flat body, keep Payload: Args Only enabled.

Best Regards.