> ## Documentation Index
> Fetch the complete documentation index at: https://docs.helicone.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Trace Tools with cURL

> Log responses from any external tools used in your LLM applications to Helicone using cURL.

## Example

```bash theme={null}
curl -X POST https://api.worker.helicone.ai/custom/v1/log \
-H "Authorization: Bearer your_api_key" \
-H "Content-Type: application/json" \
-d '{
  "providerRequest": {
    "url": "custom-model-nopath",
    "json": {
      "_type": "tool",
      "toolName": "weather_api",
      "input": {
        "location": "San Francisco",
        "units": "celsius"
      }
    },
    "meta": {
      "user_id": "user_123",
      "session_id": "session_456",
      "environment": "production"
    }
  },
  "providerResponse": {
    "json": {
      "_type": "tool",
      "toolName": "weather_api",
      "temperature": 18.5,
      "conditions": "Partly Cloudy",
      "humidity": 72,
      "wind": {
        "speed": 12,
        "direction": "NW"
      }
    },
    "status": 200,
    "headers": {
      "content-type": "application/json",
      "cache-control": "max-age=300"
    }
  },
  "timing": {
    "startTime": {
      "seconds": 1625686222,
      "milliseconds": 500
    },
    "endTime": {
      "seconds": 1625686223,
      "milliseconds": 750
    }
  }
}'
```

## Request Structure

### Endpoint

```
POST https://api.worker.helicone.ai/custom/v1/log
```

> **Note:** The endpoint may vary depending on your Helicone setup. If the above endpoint doesn't work, you can also try:
>
> * For US: `https://api.us.helicone.ai/custom/v1/log`
> * Elsewhere: `https://api.helicone.ai/custom/v1/log`

### Headers

| Name          | Value              |
| ------------- | ------------------ |
| Authorization | Bearer `{API_KEY}` |

Replace `{API_KEY}` with your actual API Key.

### Body

```typescript theme={null}
export type HeliconeAsyncLogRequest = {
  providerRequest: ProviderRequest;
  providerResponse: ProviderResponse;
  timing: Timing;
};

export type ProviderRequest = {
  url: "custom-model-nopath";
  json: {
    _type: "tool";
    toolName: string;
    input: any;
    [key: string]: any;
  };
  meta: Record<string, string>;
};

export type ProviderResponse = {
  json: {
    _type?: "tool";
    toolName: string;
    [key: string]: any;
  };
  status: number;
  headers: Record<string, string>;
};

export type Timing = {
  // From Unix epoch in Milliseconds
  startTime: {
    seconds: number;
    milliseconds: number;
  };
  endTime: {
    seconds: number;
    milliseconds: number;
  };
};
```
