Deeplink format
Anatomy of a deeplink
https://www.doordash.com/rx/{merchant_tag}?store_id=...&item=...&signature=...
Merchants should not, under any circumstances, provide DoorDash with any identifying patient data or Protected Health Information related to the prescription order within the deeplink.
Path parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
merchant_tag | string | Yes | The unique pharmacy identifier for the merchant. |
Query parameters
| Parameter | Type | Required | Repeatable | Description |
|---|---|---|---|---|
store_id | string | Yes | No | The unique identifier for the merchant's store. |
item | string | Yes | Yes | Encodes the item details in the format: <item display name>:<copay>:<expiry>. |
fulfillment_type | string | No | No | When set to pdf_417, renders the value of fulfillment_data as a PDF417 barcode on the dasher's device for pharmacy staff to scan, instead of the standard prescription information UI. fulfillment_data is required when this parameter is set. When omitted, the dasher sees the standard prescription information. |
fulfillment_data | string | No | No | The data to encode for fulfillment, e.g. the payload to render as a barcode. Must be URL-encoded. Ignored unless fulfillment_type=pdf_417. |
signature | string | No | No | Used to verify authenticity and integrity of the URL; see signature details.Whether a merchant must sign their deeplinks is configured per merchant. When present, it must be the last parameter in the URL. |
item parameter format
<item display name>:<copay in cents>:<expiration in Unix time (seconds)>
| Component | Description |
|---|---|
item display name | The name of the item to be displayed to the consumer. This is typically the first three letters of the prescription name. Any spaces or other reserved characters must be URL-encoded. |
copay | Cost in cents. Example: 500 = $5.00. |
expiration | Unix timestamp for expiration (in seconds). Example: 1749225600. |
signature details
DoorDash verifies the authenticity and integrity of signed URLs using RSA digital signatures with the SHA-256 hashing algorithm.
Signatures must be generated using a standards-compliant RSA signature scheme, specifically PKCS#1 v1.5 as defined in RFC 8017, Section 9.2.
This corresponds to the algorithm commonly named SHA256withRSA or RSA-SHA256 in most programming languages and cryptography libraries.
The merchant should follow these steps to generate a valid signature:
- Generate an RSA public/private key pair (X.509/PKCS#8) and provide DoorDash with the public key in PEM format.
- Build the string to be signed by taking the unsigned URL (i.e. without a
signatureparameter) and extract the substring beginning with the<merchant_tag>and continuing through the last non-signature parameter (do not include the scheme, host, or leading slash). - Compute the SHA-256 digest of the string exactly as it appears, preserving its exact characters, punctuation, and encoding.
- Generate a digital signature with their private key using RSASSA-PKCS1-v1_5 with SHA-256. The signing library will automatically wrap the hash in the required ASN.1
DigestInfostructure and apply PKCS #1 v1.5 padding. The result is a binary signature value. - Encode the binary signature as a Base64 string.
- Append the
signaturequery parameter to the end of the unsigned URL, with the Base64-encoded signature as its value. This produces the final signed URL.
For a detailed walkthrough of this process, see How the signature was generated in the first example.
Example #1 - single item with signature
The following deeplink will be used for this example.
https://www.doordash.com/rx/abc?store_id=123&item=PRO:500:1749225600
&signature=AzDeRHry6phxw3s62Jmf40rzpMDPkNp6tF5r83NEO+dz/JzRk54lLO1w0
x2D+hcRHile4iSxbdF79YGHNA6QPATy5eEFR/VtvPTyfJOqAhU6wH6/QSJMfEufD9Jmj
CRBCiwj8MG8ZVQEAsAE4E0WL7RQ9L5j/tDuL4dmWi5myxsCSWRmmrZZ3ln0Zcg9AAnmM
t6H3cN24EnhxQo0j7R4ECoEmzpQ2X1lEwhJ6EgsqwTfZp3Img3v71K4dkxHvPTzHc/v0
QN/jfDqBAb+TPg7vSODZGThqW3ypeCRWsgPEunshBVkFAC7hAP/NaUpCE7oHaR4/+SoN
UIK63QpKfB+SA==
Note: Line breaks are shown above for readability only. In production, the deeplink must be a single uninterrupted URL.
The deeplink contains the following information:
| Parameter | Value | Explanation |
|---|---|---|
merchant_tag | abc | |
store_id | 123 | |
item | PRO:500:1749225600 | This item corresponds to a prescription beginning with PRO, has a $5.00 copay, and expires at Unix timestamp 1749225600 (which is June 6, 2025, 12:00 PM ET) |
signature | AzDeRHry6phxw3s62Jmf40rzpMDPkNp6tF5r83NEO+dz/JzRk54lLO1w0x2D+hcRHile4iSxbdF79YGHNA6QPATy5eEFR/VtvPTyfJOqAhU6wH6/QSJMfEufD9JmjCRBCiwj8MG8ZVQEAsAE4E0WL7RQ9L5j/tDuL4dmWi5myxsCSWRmmrZZ3ln0Zcg9AAnmMt6H3cN24EnhxQo0j7R4ECoEmzpQ2X1lEwhJ6EgsqwTfZp3Img3v71K4dkxHvPTzHc/v0QN/jfDqBAb+TPg7vSODZGThqW3ypeCRWsgPEunshBVkFAC7hAP/NaUpCE7oHaR4/+SoNUIK63QpKfB+SA== | See How the signature was generated for an explanation. |
How the signature was generated
For the purposes of this example, we will use the following key pair.
Public Key
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7DNHCd29Gaikt0vqhDKj
0IdHEMLSdPFRKMoloQan2lNadpv8a3qt01hUTA3Qe2bp3imTdPxbXhPdOQKB10X4
KwCcZgRGlgJnXmVsnpErMXExMVy5gYOHJNO/H51cbX7V01BeoYArGuJaGWEP42eh
BYjXL+GbUXahJlomTtYxFx51gpkabxLwc5hE5iXzkwRjtJvtWCRnjU22fm5QV7Bv
6MvFriUzRTGd3hP/8naG5bULk/ZvyoTtt98rclumYF+2RKBjBFJobxnjX3DZYNNL
isQ0hFbF5eBIDLIBbth2srvKCwLkcRq+l28yZCiVt0BwtrTXTnhrXoepbeAZlI5r
MQIDAQAB
-----END PUBLIC KEY-----
Private Key
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0B...[REDACTED]...
-----END PRIVATE KEY-----
Process
- The string to be signed is
abc?store_id=123&item=PRO:500:1749225600.- The SHA-256 hash of this string is
a9bcf63278a337644700c11a8262cb6238c9765af55044bb90a2affe0675cdf0(shown for illustration only, DO NOT manually hash the string; standard signing APIs handle hashing internally).
- The SHA-256 hash of this string is
- Sign using your private key with a PKCS#1 v1.5-compliant RSA signature function. Most modern languages provide a standards-compliant implementation of this algorithm through their standard or widely used crypto libraries (for example, Java
Signature.getInstance("SHA256withRSA"), Pythonprivate_key.sign(..., padding.PKCS1v15(), hashes.SHA256()), or Node.jscrypto.createSign('RSA-SHA256')). This produces a binary signature value. - Base64-encode the binary signature value to produce the following string:
AzDeRHry6phxw3s62Jmf40rzpMDPkNp6tF5r83NEO+dz/JzRk54lLO1w0x2D+hcRHile4iSxbdF79YGHNA6QPATy5eEFR/VtvPTyfJOqAhU6wH6/QSJMfEufD9JmjCRBCiwj8MG8ZVQEAsAE4E0WL7RQ9L5j/tDuL4dmWi5myxsCSWRmmrZZ3ln0Zcg9AAnmMt6H3cN24EnhxQo0j7R4ECoEmzpQ2X1lEwhJ6EgsqwTfZp3Img3v71K4dkxHvPTzHc/v0QN/jfDqBAb+TPg7vSODZGThqW3ypeCRWsgPEunshBVkFAC7hAP/NaUpCE7oHaR4/+SoNUIK63QpKfB+SA==. - Use this value as the
signaturequery param in the signed URL. - DoorDash will use the public key to verify the signature (using the same algorithm) to guarantee authenticity and integrity of the URL.
Example #2 - multiple items
The following deeplink will be used for this example.
https://www.doordash.com/rx/abc?store_id=123&item=PRO:500:1749225600
&item=MET:1295:1749398400
The deeplink contains the following information:
| Parameter | Value | Explanation |
|---|---|---|
merchant_tag | abc | |
store_id | 123 | |
item | PRO:500:1749225600 | This item corresponds to a prescription beginning with PRO, has a $5.00 copay, and expires at Unix timestamp 1749225600 (which is June 6, 2025, 12:00 PM ET) |
item | MET:1295:1749398400 | This item corresponds to a prescription beginning with MET, has a $12.95 copay, and expires at Unix timestamp 1749398400 (which is June 8, 2025, 12:00 PM ET) |
Example #3 - single item with barcode fulfillment
The following deeplink will be used for this example.
https://www.doordash.com/rx/abc?store_id=123&item=Rx%20Bundle:0:1774886400
&fulfillment_type=pdf_417&fulfillment_data=IMCB-NDIzNmViMDAtODU5Zi00YTA0LWEwOTctOTY3YmMyOTAyYzdh
Note: Line breaks are shown above for readability only. In production, the deeplink must be a single uninterrupted URL.
The deeplink contains the following information:
| Parameter | Value | Explanation |
|---|---|---|
merchant_tag | abc | |
store_id | 123 | |
item | Rx%20Bundle:0:1774886400 | An item with display name Rx Bundle (URL-encoded as Rx%20Bundle), $0 copay (the consumer already paid on the merchant's site), expires at Unix timestamp 1774886400 (which is March 30, 2026, 12:00 PM ET). |
fulfillment_type | pdf_417 | The dasher will see fulfillment_data rendered as a PDF417 barcode for pharmacy staff to scan, instead of the standard prescription information UI. |
fulfillment_data | IMCB-NDIzNmViMDAtODU5Zi00YTA0LWEwOTctOTY3YmMyOTAyYzdh | The payload encoded into the barcode. |