# llRequestSecureURL

*LSL function*

```lsl
key key llRequestSecureURL();
```

- Returns: `key`
- Energy: 10

Requests one `HTTPS://` ([SSL](https://en.wikipedia.org/wiki/SSL)) [URL](https://en.wikipedia.org/wiki/URL) for use by this [object](https://wiki.secondlife.com/wiki/object). The [http_request](/events/http_request/) [event](https://wiki.secondlife.com/wiki/event) is triggered with result of the request. [HTTPS-in](https://wiki.secondlife.com/wiki/LSL_HTTP_server#introduction) uses port `12043`.

Returns a [key](https://wiki.secondlife.com/wiki/key) used for identifying the result of the request in the [http_request](/events/http_request/) [event](https://wiki.secondlife.com/wiki/event).

```lsl title="How to use" frame="terminal"
key result = llRequestSecureURL();
```

## Caveats

- HTTPS-in uses port `12043` (that port is in the URL returned by this method).
- When a [region](https://wiki.secondlife.com/wiki/region) is (re)started all [HTTP server](/events/http_request/) URLs are automatically released and invalidated.
- Use [CHANGED_REGION_START](/constants/CHANGED_REGION_START/) to detect this so a new URL can be requested.

## Examples

<details open>
<summary>Example 1</summary>

:::note
Never ever forget to release a URL again which you have requested! URLs are region resources just like prims. If you take them all you can get into big trouble with the [region owner](https://wiki.secondlife.com/wiki/Private_Region) and/or [estate managers](https://wiki.secondlife.com/wiki/Estate_Manager).
:::

Requesting a secure URL:

```lsl collapse={1-7, 13-103}
string secureUrl;
key urlRequestId;
key selfCheckRequestId;

request_secure_url()
{
    llReleaseURL(secureUrl);
    secureUrl = "";

    urlRequestId = llRequestSecureURL();
}

throw_exception(string inputString)
{
    key owner = llGetOwner();
    llInstantMessage(owner, inputString);

    // yeah, bad way to handle exceptions by restarting.
    // However this is just a demo script...

    llResetScript();
}

default
{
    on_rez(integer start_param)
    {
        llResetScript();
    }

    changed(integer change)
    {
        if (change & (CHANGED_OWNER | CHANGED_INVENTORY))
        {
            llReleaseURL(secureUrl);
            secureUrl = "";

            llResetScript();
        }

        if (change & (CHANGED_REGION | CHANGED_REGION_START | CHANGED_TELEPORT))
            request_secure_url();
    }

    state_entry()
    {
        request_secure_url();
    }

    http_request(key id, string method, string body)
    {
        integer responseStatus = 400;
        string responseBody = "Unsupported method";

        if (method == URL_REQUEST_DENIED)
            throw_exception("The following error occurred while attempting to get a free URL for this device:\n \n" + body);

        else if (method == URL_REQUEST_GRANTED)
        {
            secureUrl = body;
            key owner = llGetOwner();
            llLoadURL(owner, "Click to visit my URL!", secureUrl);

            // check every 5 mins for dropped URL
            llSetTimerEvent(300.0);
        }
        else if (method == "GET")
        {
            responseStatus = 200;
            responseBody = "Hello world!";
        }
        // else if (method == "POST") ...;
        // else if (method == "PUT") ...;
        // else if (method == "DELETE") { responseStatus = 403; responseBody = "forbidden"; }

        llHTTPResponse(id, responseStatus, responseBody);
    }

    http_response(key id, integer status, list metaData, string body)
    {
        if (id == selfCheckRequestId)
        {
            // If you're not usually doing this,
            // now is a good time to get used to doing it!
            selfCheckRequestId = NULL_KEY;

            if (status != 200)
                request_secure_url();
        }

        else if (id == NULL_KEY)
            throw_exception("Too many HTTP requests too fast!");
    }

    timer()
    {
        selfCheckRequestId = llHTTPRequest(secureUrl,
                                [HTTP_METHOD, "GET",
                                    HTTP_VERBOSE_THROTTLE, FALSE,
                                    HTTP_BODY_MAXLENGTH, 16384],
                                "");
    }
}
```

</details>

## History

- SVN:1836 r112899 Trunk

## See also

### Functions

- [llRequestURL](/functions/llRequestURL/)
- [llGetFreeURLs](/functions/llGetFreeURLs/)
- [llReleaseURL](/functions/llReleaseURL/)
- [llHTTPResponse](/functions/llHTTPResponse/)
- [llGetHTTPHeader](/functions/llGetHTTPHeader/)

### Articles

- [LSL http server](https://wiki.secondlife.com/wiki/LSL_http_server)

---

*Source: [LlRequestSecureURL](https://wiki.secondlife.com/wiki/LlRequestSecureURL) on the Second Life Wiki. Content from the Second Life Wiki article LlRequestSecureURL (revision 1218304, 2025-05-20), CC BY-SA 3.0.*

---

From lsl.dev: https://lsl.dev/functions/llRequestSecureURL/
