MinuteDock

Contacts

MinuteDock Contacts are Companies or Clients that Users can record time entries against.

Contacts Overview

{
  "id": 123,
Integer

Primary key identifier for this contact

  "name": "An Amazing Customer",
String

The name of this contact

  "short_code": "amazing",
String

The short code ("@code") used to reference this contact in the MinuteDock dock bar. The API returns the "code" part, without the "@" symbol.

  "pinned": true,
Boolean (Literals)

Whether or not this Contact appears on the "pinned" list inside MinuteDock

  "default_rate_dollars": "100.00",
String

The default hourly rate for this contact, in dollars.

  "active": true,
Boolean (Literals)

Whether the contact is still active in the account.

  "budget_type": "hours",
String

The type of budget, if any. One of: hours, billable.

  "budget_frequency": "monthly",
String

The frequency of the budget, if any. Either "total" - a budget tracking all time for the project, or "monthly", a budget for time across the current month, or "weekly - a budget of time across the current week.

  "budget_target": 12.5,
Number

The target for the budget. If an "hours" budget_type, then this is the number of hours targeted. If a "billable" budget type, then this is the value of billable time targeted.

  "budget_progress": 10.5
Number

The current value of the budget's progress. Blank if there is no budget. eg. if there are 10.5 hours completed out of the budget of 12.5 hours, then this field will show 10.5.

}

List all available contacts

Open in API Explorer
GET /contacts.json

Shows all contacts that are available for the current account.

Example Request

Format:
curl --request GET \
  --url 'https://minutedock.com/api/v1/contacts.json?pinned=true&active=true&api_key=YOUR%20API%20KEY%20HERE' \
  --header 'accept: application/json'
require 'uri'
require 'net/http'

url = URI("https://minutedock.com/api/v1/contacts.json?pinned=true&active=true&api_key=YOUR%20API%20KEY%20HERE")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

request = Net::HTTP::Get.new(url)
request["accept"] = 'application/json'

response = http.request(request)
puts response.read_body
var http = require("https");

var options = {
  "method": "GET",
  "hostname": "minutedock.com",
  "port": null,
  "path": "/api/v1/contacts.json?pinned=true&active=true&api_key=YOUR%20API%20KEY%20HERE",
  "headers": {
    "accept": "application/json"
  }
};

var req = http.request(options, function (res) {
  var chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    var body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.end();
import http.client

conn = http.client.HTTPSConnection("minutedock.com")

headers = { 'accept': "application/json" }

conn.request("GET", "/api/v1/contacts.json?pinned=true&active=true&api_key=YOUR%20API%20KEY%20HERE", headers=headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://minutedock.com/api/v1/contacts.json?pinned=true&active=true&api_key=YOUR%20API%20KEY%20HERE",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => array(
    "accept: application/json"
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
package main

import (
	"fmt"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://minutedock.com/api/v1/contacts.json?pinned=true&active=true&api_key=YOUR%20API%20KEY%20HERE"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("accept", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}

Query Parameters

Name Type Required Description Example
pinned Boolean Optional

Include only pinned contacts.

true
active Boolean Optional

Include only active contacts (i.e. contacts that haven't been hidden/deleted in the UI)

true

Responses

200 Success Contacts List
[
  "id": 123,
Integer

Primary key identifier for this contact

  "name": "An Amazing Customer",
String

The name of this contact

  "short_code": "amazing",
String

The short code ("@code") used to reference this contact in the MinuteDock dock bar. The API returns the "code" part, without the "@" symbol.

  "pinned": true,
Boolean (Literals)

Whether or not this Contact appears on the "pinned" list inside MinuteDock

  "default_rate_dollars": "100.00",
String

The default hourly rate for this contact, in dollars.

  "active": true,
Boolean (Literals)

Whether the contact is still active in the account.

  "budget_type": "hours",
String

The type of budget, if any. One of: hours, billable.

  "budget_frequency": "monthly",
String

The frequency of the budget, if any. Either "total" - a budget tracking all time for the project, or "monthly", a budget for time across the current month, or "weekly - a budget of time across the current week.

  "budget_target": 12.5,
Number

The target for the budget. If an "hours" budget_type, then this is the number of hours targeted. If a "billable" budget type, then this is the value of billable time targeted.

  "budget_progress": 10.5
Number

The current value of the budget's progress. Blank if there is no budget. eg. if there are 10.5 hours completed out of the budget of 12.5 hours, then this field will show 10.5.

]

Create Contact

Open in API Explorer
POST /contacts

Create a new contact

Example Request

Format:
curl --request POST \
  --url 'https://minutedock.com/api/v1/contacts?api_key=YOUR%20API%20KEY%20HERE' \
  --header 'accept: application/json' \
  --header 'content-type: multipart/form-data; boundary=---011000010111000001101001' \
  --form 'contact[name]=New Client Pty.' \
  --form 'contact[short_code]=@new_client' \
  --form 'contact[default_rate_dollars]=150' \
  --form 'contact[budget_type]=hours' \
  --form 'contact[budget_frequency]=monthly' \
  --form 'contact[budget_target]=12.5'
require 'uri'
require 'net/http'

url = URI("https://minutedock.com/api/v1/contacts?api_key=YOUR%20API%20KEY%20HERE")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

request = Net::HTTP::Post.new(url)
request["accept"] = 'application/json'
request["content-type"] = 'multipart/form-data; boundary=---011000010111000001101001'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[name]\"\r\n\r\nNew Client Pty.\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[short_code]\"\r\n\r\n@new_client\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[default_rate_dollars]\"\r\n\r\n150\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[budget_type]\"\r\n\r\nhours\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[budget_frequency]\"\r\n\r\nmonthly\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[budget_target]\"\r\n\r\n12.5\r\n-----011000010111000001101001--\r\n"

response = http.request(request)
puts response.read_body
var http = require("https");

var options = {
  "method": "POST",
  "hostname": "minutedock.com",
  "port": null,
  "path": "/api/v1/contacts?api_key=YOUR%20API%20KEY%20HERE",
  "headers": {
    "accept": "application/json",
    "content-type": "multipart/form-data; boundary=---011000010111000001101001"
  }
};

var req = http.request(options, function (res) {
  var chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    var body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.write("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[name]\"\r\n\r\nNew Client Pty.\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[short_code]\"\r\n\r\n@new_client\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[default_rate_dollars]\"\r\n\r\n150\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[budget_type]\"\r\n\r\nhours\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[budget_frequency]\"\r\n\r\nmonthly\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[budget_target]\"\r\n\r\n12.5\r\n-----011000010111000001101001--\r\n");
req.end();
import http.client

conn = http.client.HTTPSConnection("minutedock.com")

payload = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[name]\"\r\n\r\nNew Client Pty.\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[short_code]\"\r\n\r\n@new_client\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[default_rate_dollars]\"\r\n\r\n150\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[budget_type]\"\r\n\r\nhours\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[budget_frequency]\"\r\n\r\nmonthly\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[budget_target]\"\r\n\r\n12.5\r\n-----011000010111000001101001--\r\n"

headers = {
    'accept': "application/json",
    'content-type': "multipart/form-data; boundary=---011000010111000001101001"
    }

conn.request("POST", "/api/v1/contacts?api_key=YOUR%20API%20KEY%20HERE", payload, headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://minutedock.com/api/v1/contacts?api_key=YOUR%20API%20KEY%20HERE",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[name]\"\r\n\r\nNew Client Pty.\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[short_code]\"\r\n\r\n@new_client\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[default_rate_dollars]\"\r\n\r\n150\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[budget_type]\"\r\n\r\nhours\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[budget_frequency]\"\r\n\r\nmonthly\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[budget_target]\"\r\n\r\n12.5\r\n-----011000010111000001101001--\r\n",
  CURLOPT_HTTPHEADER => array(
    "accept: application/json",
    "content-type: multipart/form-data; boundary=---011000010111000001101001"
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://minutedock.com/api/v1/contacts?api_key=YOUR%20API%20KEY%20HERE"

	payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[name]\"\r\n\r\nNew Client Pty.\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[short_code]\"\r\n\r\n@new_client\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[default_rate_dollars]\"\r\n\r\n150\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[budget_type]\"\r\n\r\nhours\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[budget_frequency]\"\r\n\r\nmonthly\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[budget_target]\"\r\n\r\n12.5\r\n-----011000010111000001101001--\r\n")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("accept", "application/json")
	req.Header.Add("content-type", "multipart/form-data; boundary=---011000010111000001101001")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}

Form Data Parameters

Name Type Required Description Example
contact[name] String Required

Name of the new Contact to be added.

New Client Pty.
contact[short_code] String Optional

Short Reference code for the new contact.

@new_client
contact[default_rate_dollars] Integer Optional

Default hourly rate (in whole currency units) for the new Contact.

150
contact[budget_type] String Optional

The type of budget, if any. One of: "hours" or "billable". Leave blank for no budget.

hours
contact[budget_frequency] String Optional

The frequency of the budget, if any. Either "total" - a budget tracking all time for the project, or "monthly", a budget for time across the current month, or "weekly - a budget of time across the current week. Leave blank for no budget.

monthly
contact[budget_target] Number Optional

The target for the budget. If an "hours" budget_type, then this is the number of hours targeted. If a "billable" budget type, then this is the value of billable time targeted.

12.5

Responses

200 Success

The new contact you've created!

Contacts Default
{
  "id": 123,
Integer

Primary key identifier for this contact

  "name": "An Amazing Customer",
String

The name of this contact

  "short_code": "amazing",
String

The short code ("@code") used to reference this contact in the MinuteDock dock bar. The API returns the "code" part, without the "@" symbol.

  "pinned": true,
Boolean (Literals)

Whether or not this Contact appears on the "pinned" list inside MinuteDock

  "default_rate_dollars": "100.00",
String

The default hourly rate for this contact, in dollars.

  "active": true,
Boolean (Literals)

Whether the contact is still active in the account.

  "budget_type": "hours",
String

The type of budget, if any. One of: hours, billable.

  "budget_frequency": "monthly",
String

The frequency of the budget, if any. Either "total" - a budget tracking all time for the project, or "monthly", a budget for time across the current month, or "weekly - a budget of time across the current week.

  "budget_target": 12.5,
Number

The target for the budget. If an "hours" budget_type, then this is the number of hours targeted. If a "billable" budget type, then this is the value of billable time targeted.

  "budget_progress": 10.5
Number

The current value of the budget's progress. Blank if there is no budget. eg. if there are 10.5 hours completed out of the budget of 12.5 hours, then this field will show 10.5.

}
200 Validation Error

This will be returned if your Contact fails validation. Usually this means you haven't specified a contact name, or that the short_code you've specified isn't unique.

Contacts Error
{
  "error": "invalid",
String

This is always the literal string "invalid"

  "message": [
    "Short code has already been taken",
    "Short code has already been taken",
    "Short code has already been taken"
  ]
Array

Contains the validation errors that have caused your request to fail.

}

Update a Contact

Open in API Explorer
PUT /contacts/{id}.json

Update a contact's details.

Example Request

Format:
curl --request PUT \
  --url 'https://minutedock.com/api/v1/contacts/123.json?api_key=YOUR%20API%20KEY%20HERE' \
  --header 'accept: application/json' \
  --header 'content-type: multipart/form-data; boundary=---011000010111000001101001' \
  --form 'contact[name]=New Client Ltd.' \
  --form 'contact[default_rate_dollars]=120' \
  --form 'contact[short_code]=@new_client_ltd' \
  --form 'contact[budget_type]=hours' \
  --form 'contact[budget_frequency]=monthly' \
  --form 'contact[budget_target]=12.5'
require 'uri'
require 'net/http'

url = URI("https://minutedock.com/api/v1/contacts/123.json?api_key=YOUR%20API%20KEY%20HERE")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

request = Net::HTTP::Put.new(url)
request["accept"] = 'application/json'
request["content-type"] = 'multipart/form-data; boundary=---011000010111000001101001'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[name]\"\r\n\r\nNew Client Ltd.\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[default_rate_dollars]\"\r\n\r\n120\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[short_code]\"\r\n\r\n@new_client_ltd\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[budget_type]\"\r\n\r\nhours\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[budget_frequency]\"\r\n\r\nmonthly\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[budget_target]\"\r\n\r\n12.5\r\n-----011000010111000001101001--\r\n"

response = http.request(request)
puts response.read_body
var http = require("https");

var options = {
  "method": "PUT",
  "hostname": "minutedock.com",
  "port": null,
  "path": "/api/v1/contacts/123.json?api_key=YOUR%20API%20KEY%20HERE",
  "headers": {
    "accept": "application/json",
    "content-type": "multipart/form-data; boundary=---011000010111000001101001"
  }
};

var req = http.request(options, function (res) {
  var chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    var body = Buffer.concat(chunks);
    console.log(body.toString());
  });
});

req.write("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[name]\"\r\n\r\nNew Client Ltd.\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[default_rate_dollars]\"\r\n\r\n120\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[short_code]\"\r\n\r\n@new_client_ltd\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[budget_type]\"\r\n\r\nhours\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[budget_frequency]\"\r\n\r\nmonthly\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[budget_target]\"\r\n\r\n12.5\r\n-----011000010111000001101001--\r\n");
req.end();
import http.client

conn = http.client.HTTPSConnection("minutedock.com")

payload = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[name]\"\r\n\r\nNew Client Ltd.\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[default_rate_dollars]\"\r\n\r\n120\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[short_code]\"\r\n\r\n@new_client_ltd\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[budget_type]\"\r\n\r\nhours\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[budget_frequency]\"\r\n\r\nmonthly\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[budget_target]\"\r\n\r\n12.5\r\n-----011000010111000001101001--\r\n"

headers = {
    'accept': "application/json",
    'content-type': "multipart/form-data; boundary=---011000010111000001101001"
    }

conn.request("PUT", "/api/v1/contacts/123.json?api_key=YOUR%20API%20KEY%20HERE", payload, headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://minutedock.com/api/v1/contacts/123.json?api_key=YOUR%20API%20KEY%20HERE",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "PUT",
  CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[name]\"\r\n\r\nNew Client Ltd.\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[default_rate_dollars]\"\r\n\r\n120\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[short_code]\"\r\n\r\n@new_client_ltd\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[budget_type]\"\r\n\r\nhours\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[budget_frequency]\"\r\n\r\nmonthly\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[budget_target]\"\r\n\r\n12.5\r\n-----011000010111000001101001--\r\n",
  CURLOPT_HTTPHEADER => array(
    "accept: application/json",
    "content-type: multipart/form-data; boundary=---011000010111000001101001"
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io/ioutil"
)

func main() {

	url := "https://minutedock.com/api/v1/contacts/123.json?api_key=YOUR%20API%20KEY%20HERE"

	payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[name]\"\r\n\r\nNew Client Ltd.\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[default_rate_dollars]\"\r\n\r\n120\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[short_code]\"\r\n\r\n@new_client_ltd\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[budget_type]\"\r\n\r\nhours\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[budget_frequency]\"\r\n\r\nmonthly\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"contact[budget_target]\"\r\n\r\n12.5\r\n-----011000010111000001101001--\r\n")

	req, _ := http.NewRequest("PUT", url, payload)

	req.Header.Add("accept", "application/json")
	req.Header.Add("content-type", "multipart/form-data; boundary=---011000010111000001101001")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}

Path Parameters

Name Type Required Description Example
id Integer Required

The Primary Key identifier of the contact you'd like to update.

123

Form Data Parameters

Name Type Required Description Example
contact[name] String Optional

Updated name for the Contact

New Client Ltd.
contact[default_rate_dollars] Integer Optional

New hourly rate for the contact.

120
contact[short_code] String Optional

Updated short_code for the client.

@new_client_ltd
contact[budget_type] String Optional

The type of budget, if any. One of: "hours" or "billable". Leave blank for no budget.

hours
contact[budget_frequency] String Optional

The frequency of the budget, if any. Either "total" - a budget tracking all time for the project, or "monthly", a budget for time across the current month, or "weekly - a budget of time across the current week. Leave blank for no budget.

monthly
contact[budget_target] String Optional

The target for the budget. If an "hours" budget_type, then this is the number of hours targeted. If a "billable" budget type, then this is the value of billable time targeted.

12.5

Responses

200 Success

The updated contact information

Contacts Default
{
  "id": 123,
Integer

Primary key identifier for this contact

  "name": "An Amazing Customer",
String

The name of this contact

  "short_code": "amazing",
String

The short code ("@code") used to reference this contact in the MinuteDock dock bar. The API returns the "code" part, without the "@" symbol.

  "pinned": true,
Boolean (Literals)

Whether or not this Contact appears on the "pinned" list inside MinuteDock

  "default_rate_dollars": "100.00",
String

The default hourly rate for this contact, in dollars.

  "active": true,
Boolean (Literals)

Whether the contact is still active in the account.

  "budget_type": "hours",
String

The type of budget, if any. One of: hours, billable.

  "budget_frequency": "monthly",
String

The frequency of the budget, if any. Either "total" - a budget tracking all time for the project, or "monthly", a budget for time across the current month, or "weekly - a budget of time across the current week.

  "budget_target": 12.5,
Number

The target for the budget. If an "hours" budget_type, then this is the number of hours targeted. If a "billable" budget type, then this is the value of billable time targeted.

  "budget_progress": 10.5
Number

The current value of the budget's progress. Blank if there is no budget. eg. if there are 10.5 hours completed out of the budget of 12.5 hours, then this field will show 10.5.

}