# Creating Passes

### Verify Ownership

#### 3mint Wallet

We validate users who own a 3mint wallet automatically by leveraging their existing authentication. You can skip to the ["Creating a pass"](#creating-a-pass) section, otherwise you must generate a signature for other crypto wallets.

#### Other Wallets

To create a mobile pass associated with the user's crypto wallet or NFT, their ownership must be proven. This is achieved by requesting the user to sign a message from their wallet.

We require the message to sign to be in the following format:

```javascript
`Sign this message to generate a mobile pass with 3mint.io\n${userPublicAddress}\n${Date.now()}`;
```

The message contains the user's public wallet address and a timestamp to ensure every signed message is unique.

Using the message, a user must sign it using their crypto wallet, such as MetaMask or Coinbase wallets. This process will generate the signature which allows anyone to decrypt it using the user's associated public key for verification.

The user's wallet is responsible for signing the message and can be achieved using a web3 library such as [ether.js](https://github.com/ethers-io/ethers.js/) to trigger the action. It will initiate a signing request for the user's wallet, then it is up to the user to interact and follow the wallet prompts:

```javascript
// Initialize
const provider = new ethers.providers.Web3Provider(window.ethereum);

// Connect
const publicAddresses = await provider.send("eth_requestAccounts", []);

// Sign
const message = `Sign this message to generate a mobile pass with 3mint.io\n${publicAddresses[0]}\n${Date.now()}`;
const signer = provider.getSigner();
const signature = await signer.signMessage(message);
```

### Creating a Pass

Now that we have a signature that proves the user's ownership of the wallet or NFT, we can create a request to generate a mobile pass:

```javascript
const payload = {
    "userAddress": publicAddresses[0], // From previous step
    "chain": {
        "name": "evm",
        "network": 80001 // Polygon Mumbai
    },
    "signatureMessage": message, // From previous step; not required for 3mint wallet users
    "signature": signature, // From previous step; not required for 3mint wallet users
    "image": "https://path-to-image",
    "nft": { // Optional
        "contractInterface": "0xd9b67a26", // ERC-1155 = 0xd9b67a26, ERC-721 = 0x80ac58cd
        "contractAddress": "***",
        "tokenId": "***"
    },
    "pass": { // Apple example, customize as needed =>
        "description": "3mint NFT Pass",
        "logoText": "MY EVENTS",
        "labelColor": "rgb(255,153,0)",
        "backgroundColor": "rgb(0,0,128)",
        "foregroundColor": "rgb(255,255,204)",
        "appLaunchURL": "httsp://3mint.io",
        "auxiliaryFields": [
            {
                "key": "1",
                "label": "Aux 1",
                "value": "Abc"
            },
            {
                "key": "2",
                "label": "Aux 2",
                "value": "Def"
            },
            {
                "key": "3",
                "label": "Aux 3",
                "value": "Xyz"
            }
        ],
        "backFields": [
            {
                "key": "4",
                "label": "Back 1",
                "value": "Abc"
            },
            {
                "key": "5",
                "label": "Back 2",
                "value": "Def"
            },
            {
                "key": "6",
                "label": "Back 3",
                "value": "Xyz"
            }
        ],
        "headerFields": [
            {
                "key": "7",
                "label": "Header 1",
                "value": "Abc"
            },
            {
                "key": "8",
                "label": "Header 2",
                "value": "Def"
            },
            {
                "key": "9",
                "label": "Header 3",
                "value": "Xyz"
            }
        ],
        "primaryFields": [
            {
                "key": "10",
                "label": "Primary 1",
                "value": "Abc"
            },
            {
                "key": "11",
                "label": "Primary 2",
                "value": "Def"
            },
            {
                "key": "12",
                "label": "Primary 3",
                "value": "Xyz"
            }
        ],
        "secondaryFields": [
            {
                "key": "13",
                "label": "Secondary 1",
                "value": "Abc"
            },
            {
                "key": "14",
                "label": "Secondary 2",
                "value": "Def"
            },
            {
                "key": "15",
                "label": "Secondary 3",
                "value": "Xyz"
            }
        ],
        "associatedStoreIdentifiers": [0]
    }
}
```

With this payload, you can send the request to our 3mint endpoint, ensure your account is authenticated by providing the 3mint API key in the request header:

```javascript
const response = await fetch('https://api.3mint.io/nft/pass', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    "X-API-KEY": '***'
  },
  body: JSON.stringify(payload)
});

const result = await response.json();
```

The result will contain the pass details including a URL for the user to download the pass to their Apple or Google wallet:

```json
{
    "id": "***",
    "createdAt": "2023-03-01T14:43:24.528384+00:00",
    "delegation": null,
    "expireAction": null,
    "expiredAt": null,
    "externalId": null,
    "lastScannedAt": null,
    "ownerAddress": "***",
    "platform": "apple",
    "chain": {
        "name": "evm",
        "network": "80001"
    },
    "registrations": [],
    "nfts": [
        {
            "id": "***",
            "contractAddress": "***",
            "tokenId": "***",
            "contractInterface": "0xd9b67a26"
        }
    ],
    "buffer": {...},
    "fileURL": "https://api.3mint.io/api/link/laWZp4I0RRRGJQpme2hbRzcGJbaX34Yx"
}
```

The `fileURL` value can be offered as a link for the users to tap from their mobile device. It will prompt the user to add the pass to their Apple or Google wallet:

<figure><img src="/files/dgN4qzb13hf6KPDuZxCt" alt=""><figcaption></figcaption></figure>

#### QR Code

You may create a QR code using a library, such as [qrcode](https://github.com/soldair/node-qrcode), to display it for the user to scan with their mobile camera by passing in the file URL from the previous response:

```javascript
const url = QRCode.toDataURL(response.fileURL);
...
<img src={url} width="250" height="250" alt="QR Code for Mobile Pass" />
```

<figure><img src="/files/NZ862ScMf4w37q886lbj" alt=""><figcaption></figcaption></figure>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.3mint.io/developer-guides/wallets/mobile-pass/creating-passes.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
