---
name: "curl_multi_init"
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_multi_init"
---

# curl\_multi\_init(3)

create a multi handle

## NAME

curl\_multi\_init - create a multi handle

## SYNOPSIS

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

## 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)](/curl_multi_cleanup/3.md)* 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

This functionality affects all supported protocols

## 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

Added in curl 7.9.6

## RETURN VALUE

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

## SEE ALSO

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