Pairing Codes
Part of the MountDev Ops Workspace documentation. Updated November 14, 2026
MountDev Ops Workspace documentation | Updated November 14, 2026
Our Commitment MountDev Ops is built security first. Your business data belongs to you, and you can export all of it at any time. We never use analytics or tracking of any kind inside MountDev Ops.
A pairing code lets an outside app connect to one record in your workspace without anyone copying a key by hand. You make a one-time code on a record, such as a website, and give it to the app. The app trades it, once, for a key that reaches only that record. Every account has pairing codes, for any app the account builds or uses. Only owners and admins make them. No AI agent and no API key can make, see, or revoke one.
Make a Pairing Code
Open any record's page. Under it is a Pairing Codes card (owners and admins only). Select Make a Pairing Code (action core.pairing.create) and choose:
- How it is sent: pasted by a person, good for 24 hours, or inside a download, good for 7 days.
- What the key may do: the read-only scopes the app's key will have, such as
sites:readoractivity:read. They are the same scopes an API key can have (see The Workspace API). Leave all of them off and the key can only ask who it is. - Only from this address (optional): a website name, such as
shop.example.com. When it is set, the app must say it is that address when it uses the code, or the code is refused.
The code is shown once, in a small window with Copy. Copy it then and give it to the app. Only a fingerprint of it is kept, so nobody can see it again, including you, your owners, and us. Making a code is written in the Activity Log with the record, never the code.
The List of Codes
The card lists the codes made for that record, newest first, each with the last four characters of its code, its state, its scopes, its address, and who made it (action core.pairing.list). A code is Waiting, Used, Expired, Revoked, or Locked.
Revoke (action core.pairing.revoke) stops a waiting code at once, for good. Make a new code if the app still needs to connect. A code that was used cannot be revoked; revoke the key it made instead, on Settings, Connections, API Keys.
How an App Uses a Code
The app sends one request to your workspace's API address, with no key:
POST /account/api/v1/pair with a JSON body of code, and optionally address (the website name it is using the code from) and public_key (its own public key, 32 bytes in base64url).
The answer is { "result": { "key": "...", "record": { "module": "...", "id": 1 }, "scopes": [ ... ] } }. The key is shown once. The app sends it as Authorization: Bearer <key>, like any API key.
A code works once, only for its own record, only from its own address when it names one, and not after it expires. Every refusal says the same thing, so a guess learns nothing: "That pairing code is not valid. It may be used, expired, or for a different address. Ask for a new one." Five tries from the wrong address lock a code for good. Each address may try ten times a minute, and each record twenty, and a refused try still counts. Every use and every refusal is written in the Activity Log, never with the code.
What the Key Can Do
A key a pairing code made is limited to that one record. Asking GET me tells it its record and scopes. It has three more addresses, all GET, all answered from your own workspace's records, never from anywhere else. Every other address, record, and method answers "not found", as it does for a record the key may not see. It can be rotated or revoked on Settings, Connections, API Keys, where it is listed with the record it belongs to. It cannot be edited into more access: revoke it and make a new code instead.
| Address | Needs the scope | Answers |
|---|---|---|
GET record | sites:read | The record's own values. |
GET record/linked | sites:read | The records that link to it, grouped by module, up to 50 of each (more says there are more), through link fields only, one level. Add ?module=<module id> for one module and &limit=<n> for fewer. |
GET record/history | activity:read | What changed on the record and when, newest first, up to 100 changes, with how it changed and who. |
A key reads the least a person could. A field your app marks as a price or other sensitive amount is left out of every answer, including the history. A login shows its user name and address, never its password. A record that was deleted or merged into another answers "not found". A key without the needed scope is told which scope is missing (the code was made without it; make a new code). Every read is written in the Activity Log with the key's name, never what was read.
Where It Is Kept
Pairing codes (as fingerprints) and the keys they make stay in your own workspace, in its own region. Another account cannot see them, and a code from one account is refused by every other. Nothing about them is sent to us.
