Overview
Example Request
curl https://keybox.payload.co/<path>/api \
    -u secret_key_3bW9JMZtPVDOfFNzwRdfE:
The Keybox APIs use a RESTful API design to expose the underlying data model of the Keybox platform. You can explore the object structure below and for a full object reference, see the Object Reference section.
The Keybox API incorporates the object model primarily for Agents, Offices, and Properties. For payments, deposits, and receipt data and APIs, please refer to the Payload API Documentation.
API Structure
Keybox's API design incorporates a variety of concepts to create a simple, robust, and intuitive object structure. Below outlines the primary objects in the api and defines the object hierarchy.
account
- name: Brokerage
- path: brokerage
- users:
    ├── agent 1
    ├── agent 2
    ├── admin 1
    └── agent 3
- offices
    ├── office 1
    └── office 2
- properties
    ├── 123 Main St
    └── 454 Baker St
Getting Started
Authentication
# Curl supports HTTP basic authentication with the `-u` command
# To use the `-u` command, add a `:` onto the API key.
curl "https://keybox.payload.co/<path>/api/accounts" \
    -u secret_key_3bW9JMZtPVDOfFNzwRdfE:
Authentication with Keybox uses a simple API secret key. The secret key is passed as the username field in an HTTP Basic Auth header. Your secret key is available from your dashboard in the API Keys section under settings.
API Keys
The Keybox API is currently in private beta. To request access, reach out to your account manager or directly to [email protected].
API Endpoint
Keybox API base endpoint
https://keybox.payload.co/<path>/api
Every Keybox account has a unique url. This is set when your Keybox account is initially setup and can be configured from your settings within the Keybox admin dashboard.
Follow the url structure below to access the Keybox API replacing the <path> with
your unique Keybox path.
Data import
Bulk operations can be performed for an initial data import. Each object
includes a reference_id field that can be set to reference an external
record or identifier. Also, all objects include a field called attrs that
can be used for various custom attributes.
Syncing Agents
curl "https://keybox.payload.co/<path>/api/users" \
    -X POST \
    -u secret_key_3bW9JMZtPVDOfFNzwRdfE: \
    -H "Content-Type: application/json" \
    -d '[
      {
        "type": "agent",
        "name": "John Smith",
        "email": "[email protected]",
        "reference_id": "1234"
      },
      {
        "type": "agent",
        "name": "Jane Doe",
        "email": "[email protected]",
        "reference_id": "3456"
      }
    ]'
Sync your agent roster by submitting a POST api request to
/users with the user type of agent.
If you have the agent dashboard enabled from your Keybox dashboard settings, by creating the user record an invite email will be sent to the agent's email that they can use to setup their dashboard account.
Syncing Offices
curl "https://keybox.payload.co/<path>/api/offices" \
    -X POST \
    -u secret_key_3bW9JMZtPVDOfFNzwRdfE: \
    -H "Content-Type: application/json" \
    -d '[
      {
        "name": "Downtown",
        "reference_id": "34532",
        "additional_recipients": [
          {
            "name": "Mary Smith",
            "email": "[email protected]"
          }
        ]
      },
      {
        "name": "Uptown",
        "reference_id": "43531",
        "additional_recipients": [
          {
            "name": "Mark Jones",
            "email": "[email protected]"
          }
        ]
      }
    ]'
Syncing an office mainly requires an office name.
If you have office admins or certain emails that should receive payment
receipts for all transactions for a certain office, the office endpoint
accepts an additional_recipients array.
Associate Office with Agent
curl "https://keybox.payload.co/<path>/api/agents/<id_of_agent>" \
    -X PUT \
    -u secret_key_3bW9JMZtPVDOfFNzwRdfE: \
    -H "Content-Type: application/json" \
    -d '{
      "offices": [
          { "id": "offc_oPTpPxARKqQDE0YTmxevhUym" }
      ]
    }'
To associate your
agents with the office, update the offices array on the agent object
as shown in the example.
Syncing Properties
curl "https://keybox.payload.co/<path>/api/properties" \
    -X POST \
    -u secret_key_3bW9JMZtPVDOfFNzwRdfE: \
    -H "Content-Type: application/json" \
    -d '[
      {
        "property_name": "123 Example St, New York, NY 10001",
        "buyer_email": "[email protected]",
        "buyer_name": "full_name",
        "reference_id": "34532",
        "amount": 2500,
        "agent_id": "usr_oPTpPxARKqQDE0YTmxevhUym",
        "office_id": "offc_Js8YK4G4Kj88aMI9WbewU9YO"
      }
    ]'
If there's an external database of existing pending deals, you can sync
in the property and buyer details into the properties endpoint.
If your agents are using the agent dashboard you can specify
the agent_id for a property and that will make that property available
under that agent's dashboard.
Object reference
See below for a full reference section of the available API objects, defined fields, data types, permissions, and associated object references.
Users
https://keybox.payload.co/<path>/api/users
Nested Objects
https://keybox.payload.co/<path>/api/users/{id}/account
https://keybox.payload.co/<path>/api/users/{id}/offices
Example
{
  "id": "usr_1Bx9mhCzY3noDQbqwFBMTABvx",
  "object": "user",
  "account_id": "accnt_1DBfWr965LdfZaGZRtvCo5QGz",
  "agent_commission_method_id": "string",
  "agent_fees_method_id": "string",
  "attrs": {},
  "created_at": "2021-07-02 19:44:46",
  "current": false,
  "email": "[email protected]",
  "modified_at": "2021-07-02 19:44:46",
  "name": "string",
  "offices": [],
  "payload_customer_id": "string",
  "payout_approval_access": true,
  "phone": "(123) 456-7890",
  "reference_id": "string",
  "status": "added",
  "type": "agent"
}
| Attributes | Description | 
|---|---|
idstring readonly  | 
Object ID | 
objectstring readonly  | 
Value: user | 
account_idid readonly: update  | 
None | 
agent_commission_method_idstring  | 
The Payload token for the agent's commission method | 
agent_fees_method_idstring  | 
The Payload token for the agent's fee method | 
attrsjson  | 
Custom object attributes | 
created_atdatetime readonly  | 
Timestamp object was created | 
currentbool readonly  | 
The session user | 
emailemail required  | 
Email address of the user | 
modified_atdatetime readonly  | 
Timestamp object was last updated | 
namestring required  | 
Full name of the user | 
officeslist  | 
Array of associated Office objects | 
payload_customer_idstring readonly  | 
The Payload customer id | 
payout_approval_accessbool readonly  | 
Admin only: flag for user with payout approval access | 
phonephone  | 
Phone number of the user | 
reference_idstring  | 
An optional external reference id | 
statusstring readonly  | 
Values: added invited active | 
typestring required  | 
Values: agent admin | 
Accounts
https://keybox.payload.co/<path>/api/accounts
Nested Objects
https://keybox.payload.co/<path>/api/accounts/{id}/earnest_deposit_accounts
https://keybox.payload.co/<path>/api/accounts/{id}/offices
Example
{
  "id": "accnt_1hOayVhtueYzKUAgjQUVTjjhF",
  "object": "account",
  "attrs": {},
  "created_at": "2021-07-02 19:44:46",
  "earnest_deposit_accounts": [],
  "modified_at": "2021-07-02 19:44:46",
  "name": "string",
  "offices": [],
  "org_id": "string",
  "path": "string",
  "payload_client_key": "string",
  "integrations": {
    "DocuSign": {
      "enabled": true
    },
    "DotLoop": {
      "enabled": false
    }
  },
  "modules": {
    "agent_commission": {
      "enabled": true
    },
    "agent_fees": {
      "enabled": true,
      "processing_id": "string"
    },
    "dashboard": {
      "enabled": false,
      "standard_login": false
    },
    "earnest_money": {
      "enabled": false
    }
  }
}
| Attributes | Description | 
|---|---|
idstring readonly  | 
Object ID | 
objectstring readonly  | 
Value: account | 
attrsjson  | 
Custom object attributes | 
created_atdatetime readonly  | 
Timestamp object was created | 
earnest_deposit_accountslist  | 
Array of associated Escrow Account objects | 
modified_atdatetime readonly  | 
Timestamp object was last updated | 
namestring required  | 
The account name | 
officeslist  | 
Array of associated Office objects | 
org_idstring readonly  | 
The Payload org id associated with the account | 
pathstring required  | 
The root url path for the account | 
payload_client_keystring readonly  | 
Payload client key for account | 
| integrations: | 
|---|
| DocuSign: | |
|---|---|
enabledbool  | 
Toggle Docusign integration | 
| DotLoop: | |
|---|---|
enabledbool  | 
Toggle DotLoop integration | 
| modules: | 
|---|
| agent_commission: | |
|---|---|
enabledbool readonly  | 
Toggle the agent commission dashboard module | 
| agent_fees: | |
|---|---|
enabledbool readonly  | 
Toggle the agent fee dashboard module | 
processing_idstring readonly  | 
The receiving processing account for agent fees | 
| dashboard: | |
|---|---|
enabledbool  | 
Toggle the agent dashboard | 
standard_loginbool  | 
Enable standard login access to dashboard | 
| earnest_money: | |
|---|---|
enabledbool  | 
Toggle earnest dashboard module | 
Properties
https://keybox.payload.co/<path>/api/properties
Nested Objects
https://keybox.payload.co/<path>/api/properties/{id}/office
Example
{
  "id": "prop_MXGEydwszNisIz2IfzDJxJ64",
  "object": "property",
  "agent_id": "usr_1SDghs4T3TlZlV4p6rFYzWoq4",
  "amount": 396.18,
  "attrs": {},
  "buyer_email": "[email protected]",
  "buyer_name": "full_name",
  "created_at": "2021-07-02 19:44:46",
  "escrow_account_id": "1VTLNb7Lt7f6DpVG0tlBfwP6u",
  "modified_at": "2021-07-02 19:44:46",
  "office_id": "offc_h97S9ObJ6cc8ENtcrMIY9WUw",
  "pay_link_url": "string",
  "property_name": "string",
  "received_at": "2021-07-02 19:44:46",
  "reference_id": "string",
  "sent_at": "2021-07-02 19:44:46",
  "status": "pending",
  "transaction_status": "string"
}
| Attributes | Description | 
|---|---|
idstring readonly  | 
Object ID | 
objectstring readonly  | 
Value: property | 
agent_idid  | 
None | 
amountnumber  | 
The amount of the earnest money deposit | 
attrsjson  | 
Custom object attributes | 
buyer_email | 
The email of the buyer | 
buyer_namefull_name  | 
The name of the buyer | 
created_atdatetime readonly  | 
Timestamp object was created | 
escrow_account_idid  | 
None | 
modified_atdatetime readonly  | 
Timestamp object was last updated | 
office_idid readonly: update  | 
None | 
pay_link_urlstring  | 
The payment link sent to the buyer | 
property_namestring required  | 
The name or address of the property | 
received_atdatetime  | 
The timestamp the payment was received | 
reference_idstring  | 
An optional reference id | 
sent_atdatetime  | 
The timestamp the request was sent to the buyer | 
statusstring  | 
Values: pending sent received | 
transaction_statusstring  | 
The status of the associated Payload transaction | 
Offices
https://keybox.payload.co/<path>/api/offices
Nested Objects
https://keybox.payload.co/<path>/api/offices/{id}/account
Example
{
  "id": "offc_26sLXM28PsNg5zr09XCMwCPBT",
  "object": "office",
  "account_id": "accnt_urD3D9YZ35xDARtxpMUv6YKD",
  "attrs": {},
  "created_at": "2021-07-02 19:44:46",
  "modified_at": "2021-07-02 19:44:46",
  "name": "string",
  "reference_id": "string",
  "additional_recipients": [
    {
      "email": "[email protected]",
      "name": "string"
    }
  ]
}
| Attributes | Description | 
|---|---|
idstring required  | 
Object ID | 
objectstring readonly  | 
Value: office | 
account_idid readonly  | 
ID of the associated office | 
attrsjson  | 
Custom object attributes | 
created_atdatetime readonly  | 
Timestamp object was created | 
modified_atdatetime readonly  | 
Timestamp object was last updated | 
namestring  | 
Name of the office | 
reference_idstring  | 
An optional external reference id | 
| additional_recipients: | |
|---|---|
email | 
Email of additional recipient | 
namestring  | 
Name of additional recipient |