BoundaryML/baml · error

Failed to submit BAML log

Error message

Failed to submit BAML log: {url}. Status: {status}
Body: {body}

What it means

After executing the POST in the tracing wrapper's `post` method, a non-success HTTP status is treated as a hard failure. The error includes the target URL, the HTTP status code, and the response body so the server-side rejection reason can be diagnosed.

Solutions

  1. Read the Status and Body in the error message to identify the server's rejection reason.
  2. Check and refresh the BOUNDARY API key / authentication credentials (401/403 cases).
  3. Retry later or check collector service health if the status is 5xx; fix the payload/URL if the status is 4xx.
  4. Respect rate-limit headers and back off if the status is 429.

Example fix

// before (stale credentials)
client.post(...).bearer_auth(&expired_api_key)  // 401 -> this error
// after
// regenerate the key in the dashboard
client.post(...).bearer_auth(&fresh_api_key)
Defensive patterns

Strategy: retry

Validate before calling

// Before enabling submission, validate the API key against the collector health endpoint
curl -fsS -H "Authorization: Bearer $BOUNDARY_API_KEY" "$BOUNDARY_URL/health" || echo "auth or endpoint problem"

Try / catch

// Rust: retry 5xx/429 only; fail fast on 4xx
match wrapper.post(&url, &body).await {
    Err(e) if is_retryable_status(&e) => retry_with_backoff(3),
    Err(e) => { log::warn!("log submission rejected: {e}"); Ok(default) },
    ok => ok,
}

Prevention

When it happens

Trigger: The tracing/log-submission endpoint responds with 4xx/5xx: invalid or expired API key (401/403), malformed payload rejected by the server (400/422), server error (5xx), or rate limiting (429).

Common situations: Rotated or missing BOUNDARY API key authenticating against the collector; posting logs to a URL for the wrong environment; collector service outage returning 502/503.

Understand the failure class

Background: "API error: {status}" and "HTTP 401/403/404/429/5xx" errors: non-2xx HTTP responses explained — this error's family across 27 libraries.

Related errors


AI-assisted analysis of BoundaryML/baml@bd85ce9dee (2026-09-12). Data as JSON: /api/errors/16c99955fb7d38c6. Report an issue: GitHub.

Appendix: source

Thrown at engine/baml-runtime/src/tracing/api_wrapper/mod.rs:150

impl CompleteAPIConfig {
    pub(self) async fn post<T: DeserializeOwned>(&self, path: &str, body: &Value) -> Result<T> {
        let url = format!("{}/{}", self.base_url, path);

        let req = self
            .client
            .post(&url)
            .json(body)
            .bearer_auth(&self.api_key)
            .build()?;

        let Ok(res) = self.client.execute(req).await else {
            return Err(anyhow::anyhow!("Failed to fetch: {url}"));
        };
        let status = res.status();
        let body = res.text().await?;

        if !status.is_success() {
            return Err(anyhow::anyhow!(
                "Failed to submit BAML log: {url}. Status: {status}\nBody: {body}"
            ));
        }

        match serde_json::from_str::<T>(&body) {
            Ok(v) => Ok(v),
            Err(e) => Err(anyhow::anyhow!(
                "Failed to parse response: {url}. Status: {status}\nBody: {body} \nError: {:?}",
                e
            )),
        }
    }
}

#[derive(Deserialize)]
struct LogResponse {
    #[allow(dead_code)]
    status: Option<String>,

View on GitHub (pinned to bd85ce9dee)