---
name: "curl_easy_getinfo"
section: "3"
platform: "linux"
package: "curl"
version: "8.23.0-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux", "macos"]
url: "https://new.carta.tech/curl_easy_getinfo"
---

# curl\_easy\_getinfo(3)

extract information from a curl handle

## NAME

curl\_easy\_getinfo - extract information from a curl handle

## SYNOPSIS

```
#include <curl/curl.h>
CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...);
```

## DESCRIPTION

Get the *info* kept in the *curl* handle. The third argument **MUST** be pointing to the specific type of the used option which is documented in each man page of the *info* option. The data is stored accordingly and can be relied upon only if this function returns CURLE\_OK. Use this function after a performed transfer if you want to get transfer related data.

You should not free the memory returned by this function unless it is explicitly mentioned below.

## OPTIONS

The following information can be extracted:

- CURLINFO\_ACTIVESOCKET

  The session's active socket. See *[CURLINFO\_ACTIVESOCKET(3)](/CURLINFO_ACTIVESOCKET/3.md)*

- CURLINFO\_APPCONNECT\_TIME

  The time it took from the start until the SSL connect/handshake with the remote host was completed as a double in number of seconds.

- CURLINFO\_APPCONNECT\_TIME\_T

  The time it took from the start until the SSL connect/handshake with the remote host was completed in number of microseconds. (Added in 7.60.0) See *[CURLINFO\_APPCONNECT\_TIME\_T(3)](/CURLINFO_APPCONNECT_TIME_T/3.md)*

- CURLINFO\_CAINFO

  Get the default value for *[CURLOPT\_CAINFO(3)](/CURLOPT_CAINFO/3.md)*. See *[CURLINFO\_CAINFO(3)](/CURLINFO_CAINFO/3.md)*

- CURLINFO\_CAPATH

  Get the default value for *[CURLOPT\_CAPATH(3)](/CURLOPT_CAPATH/3.md)*. See *[CURLINFO\_CAPATH(3)](/CURLINFO_CAPATH/3.md)*

- CURLINFO\_CERTINFO

  Certificate chain. See *[CURLINFO\_CERTINFO(3)](/CURLINFO_CERTINFO/3.md)*

- CURLINFO\_CONDITION\_UNMET

  Whether or not a time conditional was met or 304 HTTP response. See *[CURLINFO\_CONDITION\_UNMET(3)](/CURLINFO_CONDITION_UNMET/3.md)*

- CURLINFO\_CONNECT\_TIME

  The time it took from the start until the connect to the remote host (or proxy) was completed. As a double. See *[CURLINFO\_CONNECT\_TIME(3)](/CURLINFO_CONNECT_TIME/3.md)*

- CURLINFO\_CONNECT\_TIME\_T

  The time it took from the start until the connect to the remote host (or proxy) was completed. In microseconds. See *[CURLINFO\_CONNECT\_TIME\_T(3)](/CURLINFO_CONNECT_TIME_T/3.md)*.

- CURLINFO\_CONN\_ID

  The ID of the last connection used by the transfer. (Added in 8.2.0) See *[CURLINFO\_CONN\_ID(3)](/CURLINFO_CONN_ID/3.md)*

- CURLINFO\_CONTENT\_LENGTH\_DOWNLOAD

  (**Deprecated**) Content length from the Content-Length header. See *[CURLINFO\_CONTENT\_LENGTH\_DOWNLOAD(3)](/CURLINFO_CONTENT_LENGTH_DOWNLOAD/3.md)*

- CURLINFO\_CONTENT\_LENGTH\_DOWNLOAD\_T

  Content length from the Content-Length header. See *[CURLINFO\_CONTENT\_LENGTH\_DOWNLOAD\_T(3)](/CURLINFO_CONTENT_LENGTH_DOWNLOAD_T/3.md)*

- CURLINFO\_CONTENT\_LENGTH\_UPLOAD

  (**Deprecated**) Upload size. See *[CURLINFO\_CONTENT\_LENGTH\_UPLOAD(3)](/CURLINFO_CONTENT_LENGTH_UPLOAD/3.md)*

- CURLINFO\_CONTENT\_LENGTH\_UPLOAD\_T

  Upload size. See *[CURLINFO\_CONTENT\_LENGTH\_UPLOAD\_T(3)](/CURLINFO_CONTENT_LENGTH_UPLOAD_T/3.md)*

- CURLINFO\_CONTENT\_TYPE

  Content type from the *Content-Type:* header. We recommend using *[curl\_easy\_header(3)](/curl_easy_header/3.md)* instead. See *[CURLINFO\_CONTENT\_TYPE(3)](/CURLINFO_CONTENT_TYPE/3.md)*

- CURLINFO\_COOKIELIST

  List of all known cookies. See *[CURLINFO\_COOKIELIST(3)](/CURLINFO_COOKIELIST/3.md)*

- CURLINFO\_EARLYDATA\_SENT\_T

  Amount of TLS early data sent (in number of bytes) when CURLSSLOPT\_EARLYDATA is enabled.

- CURLINFO\_EFFECTIVE\_METHOD

  Last used HTTP method. See *[CURLINFO\_EFFECTIVE\_METHOD(3)](/CURLINFO_EFFECTIVE_METHOD/3.md)*

- CURLINFO\_EFFECTIVE\_URL

  Last used URL. See *[CURLINFO\_EFFECTIVE\_URL(3)](/CURLINFO_EFFECTIVE_URL/3.md)*

- CURLINFO\_FILETIME

  Remote time of the retrieved document. See *[CURLINFO\_FILETIME(3)](/CURLINFO_FILETIME/3.md)*

- CURLINFO\_FILETIME\_T

  Remote time of the retrieved document. See *[CURLINFO\_FILETIME\_T(3)](/CURLINFO_FILETIME_T/3.md)*

- CURLINFO\_FTP\_ENTRY\_PATH

  The entry path after logging in to an FTP server. See *[CURLINFO\_FTP\_ENTRY\_PATH(3)](/CURLINFO_FTP_ENTRY_PATH/3.md)*

- CURLINFO\_HEADER\_SIZE

  Number of bytes of all headers received. See *[CURLINFO\_HEADER\_SIZE(3)](/CURLINFO_HEADER_SIZE/3.md)*

- CURLINFO\_HTTPAUTH\_AVAIL

  Available HTTP authentication methods. See *[CURLINFO\_HTTPAUTH\_AVAIL(3)](/CURLINFO_HTTPAUTH_AVAIL/3.md)*

- CURLINFO\_HTTPAUTH\_USED

  Used HTTP authentication method. See *[CURLINFO\_HTTPAUTH\_USED(3)](/CURLINFO_HTTPAUTH_USED/3.md)*

- CURLINFO\_HTTP\_CONNECTCODE

  Last proxy CONNECT response code. See *[CURLINFO\_HTTP\_CONNECTCODE(3)](/CURLINFO_HTTP_CONNECTCODE/3.md)*

- CURLINFO\_HTTP\_VERSION

  The http version used in the connection. See *[CURLINFO\_HTTP\_VERSION(3)](/CURLINFO_HTTP_VERSION/3.md)*

- CURLINFO\_LASTSOCKET

  (**Deprecated**) Last socket used. See *[CURLINFO\_LASTSOCKET(3)](/CURLINFO_LASTSOCKET/3.md)*

- CURLINFO\_LOCAL\_IP

  Source IP address of the last connection. See *[CURLINFO\_LOCAL\_IP(3)](/CURLINFO_LOCAL_IP/3.md)*

- CURLINFO\_LOCAL\_PORT

  Source port number of the last connection. See *[CURLINFO\_LOCAL\_PORT(3)](/CURLINFO_LOCAL_PORT/3.md)*

- CURLINFO\_NAMELOOKUP\_TIME

  Time from start until name resolving completed as a double. See *[CURLINFO\_NAMELOOKUP\_TIME(3)](/CURLINFO_NAMELOOKUP_TIME/3.md)*

- CURLINFO\_NAMELOOKUP\_TIME\_T

  Time from start until name resolving completed in number of microseconds. See *[CURLINFO\_NAMELOOKUP\_TIME\_T(3)](/CURLINFO_NAMELOOKUP_TIME_T/3.md)*

- CURLINFO\_NUM\_CONNECTS

  Number of new successful connections used for previous transfer. See *[CURLINFO\_NUM\_CONNECTS(3)](/CURLINFO_NUM_CONNECTS/3.md)*

- CURLINFO\_OS\_ERRNO

  The errno from the last failure to connect. See *[CURLINFO\_OS\_ERRNO(3)](/CURLINFO_OS_ERRNO/3.md)*

- CURLINFO\_POSTTRANSFER\_TIME\_T

  The time it took from the start until the last byte is sent by libcurl. In microseconds. (Added in 8.10.0) See *[CURLINFO\_POSTTRANSFER\_TIME\_T(3)](/CURLINFO_POSTTRANSFER_TIME_T/3.md)*

- CURLINFO\_PRETRANSFER\_TIME

  The time it took from the start until the file transfer is about to begin. This includes all pre-transfer commands and negotiations that are specific to the particular protocol(s) involved. See *[CURLINFO\_PRETRANSFER\_TIME(3)](/CURLINFO_PRETRANSFER_TIME/3.md)*

- CURLINFO\_PRETRANSFER\_TIME\_T

  The time it took from the start until the file transfer is about to begin. This includes all pre-transfer commands and negotiations that are specific to the particular protocol(s) involved. In microseconds. See *[CURLINFO\_PRETRANSFER\_TIME\_T(3)](/CURLINFO_PRETRANSFER_TIME_T/3.md)*

- CURLINFO\_PRIMARY\_IP

  Destination IP address of the last connection. See *[CURLINFO\_PRIMARY\_IP(3)](/CURLINFO_PRIMARY_IP/3.md)*

- CURLINFO\_PRIMARY\_PORT

  Destination port of the last connection. See *[CURLINFO\_PRIMARY\_PORT(3)](/CURLINFO_PRIMARY_PORT/3.md)*

- CURLINFO\_PRIVATE

  User's private data pointer. See *[CURLINFO\_PRIVATE(3)](/CURLINFO_PRIVATE/3.md)*

- CURLINFO\_PROTOCOL

  (**Deprecated**) The protocol used for the connection. See *[CURLINFO\_PROTOCOL(3)](/CURLINFO_PROTOCOL/3.md)*

- CURLINFO\_PROXYAUTH\_AVAIL

  Available HTTP proxy authentication methods. See *[CURLINFO\_PROXYAUTH\_AVAIL(3)](/CURLINFO_PROXYAUTH_AVAIL/3.md)*

- CURLINFO\_PROXYAUTH\_USED

  Used HTTP proxy authentication methods. See *[CURLINFO\_PROXYAUTH\_USED(3)](/CURLINFO_PROXYAUTH_USED/3.md)*

- CURLINFO\_PROXY\_ERROR

  Detailed proxy error. See *[CURLINFO\_PROXY\_ERROR(3)](/CURLINFO_PROXY_ERROR/3.md)*

- CURLINFO\_PROXY\_SSL\_VERIFYRESULT

  Proxy certificate verification result. See *[CURLINFO\_PROXY\_SSL\_VERIFYRESULT(3)](/CURLINFO_PROXY_SSL_VERIFYRESULT/3.md)*

- CURLINFO\_QUEUE\_TIME\_T

  The time during which the transfer was held in a waiting queue before it could start for real in number of microseconds. (Added in 8.6.0) See *[CURLINFO\_QUEUE\_TIME\_T(3)](/CURLINFO_QUEUE_TIME_T/3.md)*

- CURLINFO\_REDIRECT\_COUNT

  Total number of redirects that were followed. See *[CURLINFO\_REDIRECT\_COUNT(3)](/CURLINFO_REDIRECT_COUNT/3.md)*

- CURLINFO\_REDIRECT\_TIME

  The time it took for all redirection steps include name lookup, connect, pretransfer and transfer before final transaction was started. This is zero if no redirection took place. As a double. See *[CURLINFO\_REDIRECT\_TIME(3)](/CURLINFO_REDIRECT_TIME/3.md)*

- CURLINFO\_REDIRECT\_TIME\_T

  The time it took for all redirection steps include name lookup, connect, pretransfer and transfer before final transaction was started. This is zero if no redirection took place. In number of microseconds. See *[CURLINFO\_REDIRECT\_TIME\_T(3)](/CURLINFO_REDIRECT_TIME_T/3.md)*

- CURLINFO\_REDIRECT\_URL

  URL a redirect would take you to, had you enabled redirects. See *[CURLINFO\_REDIRECT\_URL(3)](/CURLINFO_REDIRECT_URL/3.md)*

- CURLINFO\_REFERER

  Referrer header. See *[CURLINFO\_REFERER(3)](/CURLINFO_REFERER/3.md)*

- CURLINFO\_REQUEST\_SIZE

  Number of bytes sent in the issued HTTP requests. See *[CURLINFO\_REQUEST\_SIZE(3)](/CURLINFO_REQUEST_SIZE/3.md)*

- CURLINFO\_RESPONSE\_CODE

  Last received response code. See *[CURLINFO\_RESPONSE\_CODE(3)](/CURLINFO_RESPONSE_CODE/3.md)*

- CURLINFO\_RETRY\_AFTER

  The value from the Retry-After header. See *[CURLINFO\_RETRY\_AFTER(3)](/CURLINFO_RETRY_AFTER/3.md)*

- CURLINFO\_RTSP\_CLIENT\_CSEQ

  The RTSP client CSeq that is expected next. See *[CURLINFO\_RTSP\_CLIENT\_CSEQ(3)](/CURLINFO_RTSP_CLIENT_CSEQ/3.md)*

- CURLINFO\_RTSP\_CSEQ\_RECV

  RTSP CSeq last received. See *[CURLINFO\_RTSP\_CSEQ\_RECV(3)](/CURLINFO_RTSP_CSEQ_RECV/3.md)*

- CURLINFO\_RTSP\_SERVER\_CSEQ

  The RTSP server CSeq that is expected next. See *[CURLINFO\_RTSP\_SERVER\_CSEQ(3)](/CURLINFO_RTSP_SERVER_CSEQ/3.md)*

- CURLINFO\_RTSP\_SESSION\_ID

  RTSP session ID. See *[CURLINFO\_RTSP\_SESSION\_ID(3)](/CURLINFO_RTSP_SESSION_ID/3.md)*

- CURLINFO\_SCHEME

  The scheme used for the connection. See *[CURLINFO\_SCHEME(3)](/CURLINFO_SCHEME/3.md)*

- CURLINFO\_SIZE\_DELIVERED

  Number of bytes passed to the write callback. See *[CURLINFO\_SIZE\_DELIVERED(3)](/CURLINFO_SIZE_DELIVERED/3.md)*

- CURLINFO\_SIZE\_DOWNLOAD

  (**Deprecated**) Number of bytes downloaded. See *[CURLINFO\_SIZE\_DOWNLOAD(3)](/CURLINFO_SIZE_DOWNLOAD/3.md)*

- CURLINFO\_SIZE\_DOWNLOAD\_T

  Number of bytes downloaded. See *[CURLINFO\_SIZE\_DOWNLOAD\_T(3)](/CURLINFO_SIZE_DOWNLOAD_T/3.md)*

- CURLINFO\_SIZE\_UPLOAD

  (**Deprecated**) Number of bytes uploaded. See *[CURLINFO\_SIZE\_UPLOAD(3)](/CURLINFO_SIZE_UPLOAD/3.md)*

- CURLINFO\_SIZE\_UPLOAD\_T

  Number of bytes uploaded. See *[CURLINFO\_SIZE\_UPLOAD\_T(3)](/CURLINFO_SIZE_UPLOAD_T/3.md)*

- CURLINFO\_SPEED\_DOWNLOAD

  (**Deprecated**) Average download speed. See *[CURLINFO\_SPEED\_DOWNLOAD(3)](/CURLINFO_SPEED_DOWNLOAD/3.md)*

- CURLINFO\_SPEED\_DOWNLOAD\_T

  Average download speed. See *[CURLINFO\_SPEED\_DOWNLOAD\_T(3)](/CURLINFO_SPEED_DOWNLOAD_T/3.md)*

- CURLINFO\_SPEED\_UPLOAD

  (**Deprecated**) Average upload speed. See *[CURLINFO\_SPEED\_UPLOAD(3)](/CURLINFO_SPEED_UPLOAD/3.md)*

- CURLINFO\_SPEED\_UPLOAD\_T

  Average upload speed in number of bytes per second. See *[CURLINFO\_SPEED\_UPLOAD\_T(3)](/CURLINFO_SPEED_UPLOAD_T/3.md)*

- CURLINFO\_SSL\_ENGINES

  A list of OpenSSL crypto engines. See *[CURLINFO\_SSL\_ENGINES(3)](/CURLINFO_SSL_ENGINES/3.md)*

- CURLINFO\_SSL\_VERIFYRESULT

  Certificate verification result. See *[CURLINFO\_SSL\_VERIFYRESULT(3)](/CURLINFO_SSL_VERIFYRESULT/3.md)*

- CURLINFO\_STARTTRANSFER\_TIME

  The time it took from the start until the first byte is received by libcurl. As a double. See *[CURLINFO\_STARTTRANSFER\_TIME(3)](/CURLINFO_STARTTRANSFER_TIME/3.md)*

- CURLINFO\_STARTTRANSFER\_TIME\_T

  The time it took from the start until the first byte is received by libcurl. In microseconds. See *[CURLINFO\_STARTTRANSFER\_TIME\_T(3)](/CURLINFO_STARTTRANSFER_TIME_T/3.md)*

- CURLINFO\_TLS\_SESSION

  (**Deprecated**) TLS session info that can be used for further processing. See *[CURLINFO\_TLS\_SESSION(3)](/CURLINFO_TLS_SESSION/3.md)*. Use *[CURLINFO\_TLS\_SSL\_PTR(3)](/CURLINFO_TLS_SSL_PTR/3.md)* instead.

- CURLINFO\_TLS\_SSL\_PTR

  TLS session info that can be used for further processing. See *[CURLINFO\_TLS\_SSL\_PTR(3)](/CURLINFO_TLS_SSL_PTR/3.md)*

- CURLINFO\_TOTAL\_TIME

  Total time of previous transfer. See *[CURLINFO\_TOTAL\_TIME(3)](/CURLINFO_TOTAL_TIME/3.md)*

- CURLINFO\_TOTAL\_TIME\_T

  Total time of previous transfer. See *[CURLINFO\_TOTAL\_TIME\_T(3)](/CURLINFO_TOTAL_TIME_T/3.md)*

- CURLINFO\_USED\_PROXY

  Whether the proxy was used (Added in 8.7.0). See *[CURLINFO\_USED\_PROXY(3)](/CURLINFO_USED_PROXY/3.md)*

- CURLINFO\_XFER\_ID

  The ID of the transfer. (Added in 8.2.0) See *[CURLINFO\_XFER\_ID(3)](/CURLINFO_XFER_ID/3.md)*

## TIMES

An overview of the time values available from *[curl\_easy\_getinfo(3)](/curl_easy_getinfo/3.md)*

```
curl_easy_perform()
    |
    |--QUEUE
    |--|--NAMELOOKUP
    |--|--|--CONNECT
    |--|--|--|--APPCONNECT
    |--|--|--|--|--PRETRANSFER
    |--|--|--|--|--|--POSTTRANSFER
    |--|--|--|--|--|--|--STARTTRANSFER
    |--|--|--|--|--|--|--|--TOTAL
    |--|--|--|--|--|--|--|--REDIRECT
```

*[CURLINFO\_QUEUE\_TIME\_T(3)](/CURLINFO_QUEUE_TIME_T/3.md)*, *[CURLINFO\_NAMELOOKUP\_TIME\_T(3)](/CURLINFO_NAMELOOKUP_TIME_T/3.md)*, *[CURLINFO\_CONNECT\_TIME\_T(3)](/CURLINFO_CONNECT_TIME_T/3.md)*, *[CURLINFO\_APPCONNECT\_TIME\_T(3)](/CURLINFO_APPCONNECT_TIME_T/3.md)*, *[CURLINFO\_PRETRANSFER\_TIME\_T(3)](/CURLINFO_PRETRANSFER_TIME_T/3.md)*, *[CURLINFO\_POSTTRANSFER\_TIME\_T(3)](/CURLINFO_POSTTRANSFER_TIME_T/3.md)*, *[CURLINFO\_STARTTRANSFER\_TIME\_T(3)](/CURLINFO_STARTTRANSFER_TIME_T/3.md)*, *[CURLINFO\_TOTAL\_TIME\_T(3)](/CURLINFO_TOTAL_TIME_T/3.md)*, *[CURLINFO\_REDIRECT\_TIME\_T(3)](/CURLINFO_REDIRECT_TIME_T/3.md)*

## PROTOCOLS

This functionality affects all supported protocols

## EXAMPLE

```
int main(void)
{
  CURL *curl = curl_easy_init();
  if(curl) {
    CURLcode result;
    curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com/");
    result = curl_easy_perform(curl);
    if(result == CURLE_OK) {
      char *ct;
      /* ask for the content-type */
      result = curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &ct);
      if((result == CURLE_OK) && ct)
        printf("We received Content-Type: %s\n", ct);
    }
    /* always cleanup */
    curl_easy_cleanup(curl);
  }
}
```

## AVAILABILITY

Added in curl 7.4.1

## RETURN VALUE

This function returns a CURLcode indicating success or error.

CURLE\_OK (0) means everything was OK, non-zero means an error occurred, see *[libcurl-errors(3)](/libcurl-errors/3.md)*. If *[CURLOPT\_ERRORBUFFER(3)](/CURLOPT_ERRORBUFFER/3.md)* was set with *[curl\_easy\_setopt(3)](/curl_easy_setopt/3.md)* there can be an error message stored in the error buffer when non-zero is returned.

## SEE ALSO

[**curl\_easy\_setopt**(3)](/curl_easy_setopt/3.md)
