Skip to main content
Glama

Create qURL

create_qurl

Create a qURL — a policy-bound, expiring access link that gates a target URL with optional IP/geo/UA/AI-agent filters and time or session limits.

Instructions

Create a qURL — a policy-bound, expiring access link that gates a target URL with optional IP/geo/UA/AI-agent filters and time or session limits. When to use: minting a fresh protected access link for share-once or time-limited access (e.g. send a customer a 24-hour download link, gate a doc behind an IP allowlist, distribute a one-time-use credential to a contractor). Do NOT use this for chat-uploaded images, PDFs, screenshots, or file attachments. In HTTP MCP mode, those should go through upload_file_data_qurl; in stdio mode, use upload_file_qurl. When NOT to use: use mint_link when you already have a resource identifier and just need an additional access token under it — create_qurl identifies the resource by target URL and may return an existing same-type resource grouping. Use batch_create_qurls to create many in one round-trip. Use update_qurl to retag or extend an existing resource without minting a new one. If the user says 'give me the qURL of this image/file' and the content was uploaded in chat, this is the wrong tool. Behavior: not idempotent — calling twice produces two distinct qURL tokens, though both may share the same resource_id when the target URL groups to an existing same-type resource (this tool doesn't surface the underlying API's Idempotency-Key header). The returned qurl_link is shown ONCE in this response and is never recoverable through get_qurl or list_qurls; persist or share it immediately. A returned resource is in active status with the policy and per-token limits applied. Set expires_in explicitly for a predictable lifetime; otherwise the service uses its defaults. Read expires_at in the response. max_sessions is per minted qURL, not resource-wide; set one_time_use: false explicitly when you need max_sessions: 0 to mean unlimited visitors. Returns: { qurl_id: string (q_…), resource_id: string, qurl_link: string (shown once), branded_domain?: string, qurl_site: string, expires_at: string (RFC 3339), label?: string, type?: string }. qurl_id is the only q_… display ID an agent gets in this response — keep it if you plan a follow-up against get_qurl/update_qurl/mint_link (which accept either prefix). Example: create_qurl({ target_url: 'https://example.com/private', expires_in: '24h', one_time_use: true, access_policy: { geo_allowlist: ['US'] } }).

Input Schema

NameRequiredDescriptionDefault
typeNoResource type for integrations allowed to mint non-url qURLs (max 64 chars). Defaults to url.
labelNoHuman-readable label identifying who this qURL is for (max 500 chars)
expires_inNoDuration string (e.g., "1h", "24h", "7d"; the API enforces 1m to 30d)
target_urlYesThe URL to protect with qURL
max_sessionsNoMaximum concurrent sessions for this qURL token (0 = unlimited when one_time_use is explicitly false; max 1000)
one_time_useNoWhether the link can only be used once
access_policyNoAccess control policy for the qURL
custom_domainNoCustom domain to assign to the auto-created resource (max 253 chars, must be registered/active/owned).
session_durationNoHow long access lasts after the recipient reaches the content (e.g., "1h"). This anchors the resource-level session-duration cap when a new resource is created.

Output Schema

NameRequiredDescriptionDefault
typeNoResource type echoed from the create request
labelNo
qurl_idYesDisplay-friendly qURL ID (q_ prefix)
qurl_linkYesOne-shot display access link — shown ONCE on creation, never returned again. Share immediately.
qurl_siteNo
expires_atNo
resource_idYesStable resource identifier (public key or legacy r_ ID)
branded_domainNoBare branded hostname for anchor text when the resource has a usable custom domain
email_deliveryNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv0.2.2
    • changedInput schema / properties / expires_in / description
      Previous value: -"Duration string (e.g., \"1h\", \"24h\", \"7d\")"New value: +"Duration string (e.g., \"1h\", \"24h\", \"7d\"; the API enforces 1m to 30d)"
  2. Changed37 schema fields changedv0.2.1
    • removedInput schema / additionalProperties
      Removed value: -false
    • removedInput schema / properties / access_policy / additionalProperties
      Removed value: -false
    • removedInput schema / properties / access_policy / properties / ai_agent_policy / additionalProperties
      Removed value: -false
    • changedInput schema / properties / access_policy / properties / ai_agent_policy / properties / allow_categories / description
      Previous value: -"AI agent categories to permit (all others blocked)"New value: +"AI agent categories to permit (all others blocked; max 20 entries, 128 chars each)"
    • addedInput schema / properties / access_policy / properties / ai_agent_policy / properties / allow_categories / items / maxLength
      Added value: +128
    • addedInput schema / properties / access_policy / properties / ai_agent_policy / properties / allow_categories / items / minLength
      Added value: +1
    • addedInput schema / properties / access_policy / properties / ai_agent_policy / properties / allow_categories / maxItems
      Added value: +20
    • changedInput schema / properties / access_policy / properties / ai_agent_policy / properties / deny_categories / description
      Previous value: -"AI agent categories to block (e.g., gptbot, commoncrawl)"New value: +"AI agent categories to block (e.g., gptbot, commoncrawl; max 20 entries, 128 chars each)"
    • addedInput schema / properties / access_policy / properties / ai_agent_policy / properties / deny_categories / items / maxLength
      Added value: +128
    • addedInput schema / properties / access_policy / properties / ai_agent_policy / properties / deny_categories / items / minLength
      Added value: +1
    • addedInput schema / properties / access_policy / properties / ai_agent_policy / properties / deny_categories / maxItems
      Added value: +20
    • changedInput schema / properties / access_policy / properties / geo_allowlist / description
      Previous value: -"Allowed country codes (ISO 3166-1 alpha-2)"New value: +"Allowed country codes (ISO 3166-1 alpha-2; max 50 entries, 8 chars each)"
    • addedInput schema / properties / access_policy / properties / geo_allowlist / items / maxLength
      Added value: +8
    • addedInput schema / properties / access_policy / properties / geo_allowlist / items / minLength
      Added value: +1
    • addedInput schema / properties / access_policy / properties / geo_allowlist / maxItems
      Added value: +50
    • changedInput schema / properties / access_policy / properties / geo_denylist / description
      Previous value: -"Denied country codes (ISO 3166-1 alpha-2)"New value: +"Denied country codes (ISO 3166-1 alpha-2; max 50 entries, 8 chars each)"
    • addedInput schema / properties / access_policy / properties / geo_denylist / items / maxLength
      Added value: +8
    • addedInput schema / properties / access_policy / properties / geo_denylist / items / minLength
      Added value: +1
    • addedInput schema / properties / access_policy / properties / geo_denylist / maxItems
      Added value: +50
    • changedInput schema / properties / access_policy / properties / ip_allowlist / description
      Previous value: -"Allowed IP addresses or CIDR ranges"New value: +"Allowed IP addresses or CIDR ranges (max 100 entries, 64 chars each)"
    • addedInput schema / properties / access_policy / properties / ip_allowlist / items / maxLength
      Added value: +64
    • addedInput schema / properties / access_policy / properties / ip_allowlist / items / minLength
      Added value: +1
    • addedInput schema / properties / access_policy / properties / ip_allowlist / maxItems
      Added value: +100
    • changedInput schema / properties / access_policy / properties / ip_denylist / description
      Previous value: -"Denied IP addresses or CIDR ranges"New value: +"Denied IP addresses or CIDR ranges (max 100 entries, 64 chars each)"
    • addedInput schema / properties / access_policy / properties / ip_denylist / items / maxLength
      Added value: +64
    • addedInput schema / properties / access_policy / properties / ip_denylist / items / minLength
      Added value: +1
    • addedInput schema / properties / access_policy / properties / ip_denylist / maxItems
      Added value: +100
    • changedInput schema / properties / access_policy / properties / user_agent_allow_regex / description
      Previous value: -"Regex to allow matching user agents"New value: +"Regex to allow matching user agents (max 256 chars)"
    • addedInput schema / properties / access_policy / properties / user_agent_allow_regex / maxLength
      Added value: +256
    • changedInput schema / properties / access_policy / properties / user_agent_deny_regex / description
      Previous value: -"Regex to deny matching user agents"New value: +"Regex to deny matching user agents (max 256 chars)"
    • addedInput schema / properties / access_policy / properties / user_agent_deny_regex / maxLength
      Added value: +256
    • changedInput schema / properties / custom_domain / description
      Previous value: -"Custom domain to assign to the auto-created resource"New value: +"Custom domain to assign to the auto-created resource (max 253 chars, must be registered/active/owned)."
    • addedInput schema / properties / custom_domain / maxLength
      Added value: +253
    • changedInput schema / properties / max_sessions / description
      Previous value: -"Maximum concurrent sessions (0 = unlimited, max 1000)"New value: +"Maximum concurrent sessions for this qURL token (0 = unlimited when one_time_use is explicitly false; max 1000)"
    • changedInput schema / properties / session_duration / description
      Previous value: -"How long access lasts after clicking (e.g., \"1h\")"New value: +"How long access lasts after the recipient reaches the content (e.g., \"1h\"). This anchors the resource-level session-duration cap when a new resource is created."
    • addedInput schema / properties / type
      Added value: +{
      +  "description": "Resource type for integrations allowed to mint non-url qURLs (max 64 chars). Defaults to url.",
      +  "maxLength": 64,
      +  "type": "string"
      +}
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": {},
      +  "properties": {
      +    "branded_domain": {
      +      "description": "Bare branded hostname for anchor text when the resource has a usable custom domain",
      +      "type": "string"
      +    },
      +    "email_delivery": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "attempted": {
      +          "type": "boolean"
      +        },
      +        "enabled": {
      +          "type": "boolean"
      +        },
      +        "failed": {
      +          "type": "number"
      +        },
      +        "recipients": {
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "results": {
      +          "items": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "email": {
      +                "type": "string"
      +              },
      +              "error": {
      +                "type": "string"
      +              },
      +              "message_id": {
      +                "type": "string"
      +              },
      +              "skipped": {
      +                "type": "boolean"
      +              },
      +              "success": {
      +                "type": "boolean"
      +              }
      +            },
      +            "required": [
      +              "email",
      +              "success",
      +              "skipped"
      +            ],
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "sent": {
      +          "type": "number"
      +        },
      +        "skipped_reason": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "attempted",
      +        "enabled",
      +        "recipients",
      +        "sent",
      +        "failed",
      +        "results"
      +      ],
      +      "type": "object"
      +    },
      +    "expires_at": {
      +      "type": "string"
      +    },
      +    "label": {
      +      "type": "string"
      +    },
      +    "qurl_id": {
      +      "description": "Display-friendly qURL ID (q_ prefix)",
      +      "type": "string"
      +    },
      +    "qurl_link": {
      +      "description": "One-shot display access link — shown ONCE on creation, never returned again. Share immediately.",
      +      "type": "string"
      +    },
      +    "qurl_site": {
      +      "type": "string"
      +    },
      +    "resource_id": {
      +      "description": "Stable resource identifier (public key or legacy r_ ID)",
      +      "type": "string"
      +    },
      +    "type": {
      +      "description": "Resource type echoed from the create request",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "qurl_id",
      +    "resource_id",
      +    "qurl_link"
      +  ],
      +  "type": "object"
      +}
  3. First observedv0.2.0

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations (which only declare non-readonly, non-idempotent, open-world, non-destructive). It discloses the not-idempotent nuance, that the underlying Idempotency-Key is not surfaced, that qurl_link is shown ONCE and never recoverable via get_qurl/list_qurls, the per-token vs resource-wide max_sessions scope, and the one_time_use/max_sessions:0 interaction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the definition and uses bold section headers (When to use / Do NOT use / When NOT to use / Behavior / Returns) to make a long description navigable. It is on the verbose side and repeats the 'shown once' point, but nearly every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 9 params, nested access_policy, an existing output schema, and rich behavior, the description is complete: it names the return fields, explains lifetimes and session scope, routes incorrect use cases, and supplies a concrete example call. Nothing needed to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema carries most parameter documentation (baseline 3). The description still adds genuine semantics beyond it: expires_in default behavior ('otherwise the service uses its defaults'), max_sessions being per minted qURL rather than resource-wide, and the explicit one_time_use:false requirement for max_sessions:0 to mean unlimited.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Create a qURL') and immediately defines what a qURL is ('policy-bound, expiring access link that gates a target URL'), distinguishing it from siblings that resolve, extend, revoke, or batch. An agent can tell it apart from mint_link, batch_create_qurls, and update_qurl without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly provides when-to-use examples (24h download link, IP allowlist, one-time credential), when-not-to-use cases (chat uploads routed to upload_file_data_qurl/upload_file_qurl), and named alternatives with the condition that selects each (mint_link, batch_create_qurls, update_qurl). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.