curl\_multi\_init(3) Library Functions Manual curl\_multi\_init(3)

# [NAME](#NAME)

curl\_multi\_init - create a multi handle

# [SYNOPSIS](#SYNOPSIS)

```
#include <curl/curl.h>
CURLM *curl_multi_init();
```

# [DESCRIPTION](#DESCRIPTION)

This function returns a pointer to a *CURLM* handle to be used as input to all the other multi-functions, sometimes referred to as a multi handle in some places in the documentation. This init call MUST have a corresponding call to [*curl\_multi\_cleanup(3)*](/man/os/curl/curl_multi_cleanup.3) when the operation is complete.

By default, several caches are stored in and held by the multi handle: DNS cache, connection pool, TLS session ID cache and the TLS CA cert cache. All transfers using the same multi handle share these caches.

# [PROTOCOLS](#PROTOCOLS)

This functionality affects all supported protocols

# [EXAMPLE](#EXAMPLE)

```
int main(void)
{


  /* init a multi stack */


  CURLM *multi = curl_multi_init();


  CURL *curl = curl_easy_init();


  CURL *curl2 = curl_easy_init();


  /* add individual transfers */


  curl_multi_add_handle(multi, curl);


  curl_multi_add_handle(multi, curl2);
}
```

# [AVAILABILITY](#AVAILABILITY)

Added in curl 7.9.6

# [RETURN VALUE](#RETURN_VALUE)

If this function returns NULL, something went wrong and you cannot use the other curl functions.

# [SEE ALSO](#SEE_ALSO)

[**curl\_easy\_init**(3)](/man/os/curl/curl_easy_init.3), [**curl\_global\_init**(3)](/man/os/curl/curl_global_init.3), [**curl\_multi\_add\_handle**(3)](/man/os/curl/curl_multi_add_handle.3), [**curl\_multi\_cleanup**(3)](/man/os/curl/curl_multi_cleanup.3), [**curl\_multi\_get\_handles**(3)](/man/os/curl/curl_multi_get_handles.3)

2026-10-31 libcurl

---

Document: curl_multi_init(3) from curl 8.23.0-r3 (Chainguard OS)
Source: https://github.com/curl/curl.git
