---
name: "CURLOPT_DEFAULT_PROTOCOL"
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/CURLOPT_DEFAULT_PROTOCOL"
---

# CURLOPT\_DEFAULT\_PROTOCOL(3)

default protocol to use if the URL is missing a scheme name

## NAME

CURLOPT\_DEFAULT\_PROTOCOL - default protocol to use if the URL is missing a scheme name

## SYNOPSIS

```
#include <curl/curl.h>
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_DEFAULT_PROTOCOL,
                          char *protocol);
```

## DESCRIPTION

This option tells libcurl to use *protocol* if the URL set with *[CURLOPT\_URL(3)](/CURLOPT_URL/3.md)* misses a scheme name.

Use one of these protocol (scheme) names:

dict, file, ftp, ftps, gopher, http, https, imap, imaps, ldap, ldaps, pop3, pop3s, rtsp, scp, sftp, smtp, smtps, telnet, tftp

An unknown or unsupported protocol causes error *CURLE\_UNSUPPORTED\_PROTOCOL* when libcurl parses a URL without a scheme. Parsing happens when *[curl\_easy\_perform(3)](/curl_easy_perform/3.md)* or *[curl\_multi\_perform(3)](/curl_multi_perform/3.md)* is called. The protocol set supported by libcurl vary depending on how it was built. Use *[curl\_version\_info(3)](/curl_version_info/3.md)* if you need a list of protocol names supported by the build of libcurl that you are using.

This option does not change the default proxy protocol (http).

Without this option libcurl would make a guess based on the host, see *[CURLOPT\_URL(3)](/CURLOPT_URL/3.md)* for details.

The application does not have to keep the string around after setting this option.

Using this option multiple times makes the last set string override the previous ones. Set it to NULL to disable its use again.

This option does *not* adjust the scheme for URLs set with *[CURLOPT\_CURLU(3)](/CURLOPT_CURLU/3.md)*.

## DEFAULT

NULL (make a guess based on the host)

## PROTOCOLS

This functionality affects all supported protocols

## EXAMPLE

```
int main(void)
{
  CURL *curl = curl_easy_init();
  if(curl) {
    CURLcode result;
    /* set a URL without a scheme */
    curl_easy_setopt(curl, CURLOPT_URL, "example.com");
    /* set the default protocol (scheme) for schemeless URLs */
    curl_easy_setopt(curl, CURLOPT_DEFAULT_PROTOCOL, "https");
    /* Perform the request */
    result = curl_easy_perform(curl);
    curl_easy_cleanup(curl);
  }
}
```

## AVAILABILITY

Added in curl 7.45.0

## RETURN VALUE

CURLE\_OK if the option is supported.

CURLE\_OUT\_OF\_MEMORY if there was insufficient heap space.

CURLE\_UNKNOWN\_OPTION if the option is not supported.

## SEE ALSO

[**CURLINFO\_PROTOCOL**(3)](/CURLINFO_PROTOCOL/3.md), [**CURLINFO\_SCHEME**(3)](/CURLINFO_SCHEME/3.md), [**CURLOPT\_URL**(3)](/CURLOPT_URL/3.md)
