---
title: "DropletURLRequest, DroppyKit"
description: "A URL Droppy received on a droplet&#x27;s behalf."
canonical: "https://getdroppy.app/docs/droppykit/api/droplet-urlrequest"
last-updated: "2026-09-09"
---

# DropletURLRequest

A URL Droppy received on a droplet's behalf.

`struct DropletURLRequest`

Droppy owns the `droppy://` scheme. Any app, script or web page can open `droppy://droplet/<id>/<path>?<query>`, and Droppy hands it to the running droplet with that id, as one of these. The id is matched case-insensitively and the droplet has to be installed and switched on; anything else is dropped without a trace, because the scheme is reachable by everything on the Mac.

This is how a droplet that drives another app gets an answer back: it asks with the other app's own scheme and names one of these URLs as the callback (`thaw://get?key=all&callback=droppy://droplet/thaw/settings`), and the reply arrives here. Treat the payload as untrusted input: check a request id you generated, bound the size, and never run anything a URL tells you to.

## Initializers

### init(parsing:)

`init?(parsing url: URL)`

Parses a `droppy://droplet/<id>/<path>?<query>` URL (or the Playground's `droppy-playground://` equivalent), or returns `nil` when the URL is not addressed to a droplet at all.

Percent-encoding in the path and the query is decoded; a query item repeated keeps its first value. Nothing here validates the id against an installed droplet; that is the host's decision.

### init(url:dropletID:path:query:)

`init(url: URL, dropletID: String, path: String, query: [String : String])`

Creates a request. Hosts and the harness build these; a droplet only reads them.

## Properties

### dropletID

`let dropletID: String`

The droplet id the URL named, as written.

### path

`let path: String`

The path after the id, without a leading slash: `settings` for `droppy://droplet/thaw/settings`, empty when there is none.

### query

`let query: [String : String]`

The query, decoded, first value per name. Names are case-sensitive.

### url

`let url: URL`

The URL exactly as it was opened.
