Resources

Custom objects

A custom object is a kind of record you set up yourself, alongside the ones Dreamteam already gives you like contacts, companies and deals. If you sell subscriptions, track contracts or run projects, each of those can be its own custom object. Its records then behave like any other record: you list, create, edit and delete them through the same URLs, with your object's own short name in place of {object}. That short name is called its slug. The examples on this page use the slug subscription, so swap in one of your own.

You build the object in the CRM, not through this API

This API works with the records inside a custom object. It cannot create the object itself, and it cannot add or change its fields. You do that in the CRM, under object settings. To build one, along with its fields and relationships, see the help-centre guide Custom objects: building a new kind of record. Once the object exists, call Describe Object with its slug to see what fields it has, and which ones are required or have to be unique, before you write to it.

Find your custom objects

GET /api/v1/objects

Call List object types to get the slug of every object in your workspace. Your custom objects come back in the same list as the standard ones. To pick out only the custom ones, call Describe Object on each slug and keep the ones where object_kind is CUSTOM. Standard objects report STANDARD.

Returns

A list of object slugs. Your custom objects sit in the same list as the standard ones.

GET /api/v1/objects
curl 'https://api.dreamteamcrm.ai/api/v1/objects' \
  -H 'Authorization: Bearer <YOUR_TOKEN>'
[
  "company",
  "contact",
  "deal",
  "note",
  "meeting",
  "task",
  "subscription",
  "project"
]
subscription and project here are example custom objects

List a custom object's records

GET /api/v1/objects/{object}/records

Put your object's slug in the path and this returns its records a page at a time: a results array holding the records, and a metadata block describing the page. Sorting, paging and associations work exactly as they do for any other record, which is covered under List records.

Query parameters

page integer1-based page index. Defaults to 1.
page_size integerRecords per page (1-100). Defaults to 20.
GET /api/v1/objects/subscription/records
curl 'https://api.dreamteamcrm.ai/api/v1/objects/subscription/records?page=1&page_size=20' \
  -H 'Authorization: Bearer <YOUR_TOKEN>'
{
  "results": [
    {
      "id": 1048896,
      "type": "subscription",
      "properties": {
        "name": "Analytical Engines - Annual Plan",
        "start_date": "2026-11-01"
      },
      "created_at": "2026-11-05T10:00:00.000000Z",
      "updated_at": "2026-11-05T10:00:00.000000Z",
      "created_by": 1000052
    }
  ],
  "metadata": {
    "page": 1,
    "page_size": 20,
    "total_elements": 1,
    "total_pages": 1,
    "has_next": false,
    "has_previous": false
  }
}
Records for the custom object

Add a record

POST /api/v1/objects/{object}/records

Put the record's fields inside properties. They have to match the object's own schema, so check it with Describe Object first.

Two rules catch people out. Leave out a required field and you get 400 REQUIRED_FIELD_MISSING. Give a field that has to be unique (usually name) a value another record already has, and you get 400 DUPLICATE_VALUE, naming the record that already holds it. Capital letters are ignored in that check, so Annual Plan and annual plan count as the same value.

To attach the new record to a contact, company or deal, use the same <object>_ids fields you use everywhere else, such as deal_ids. Call Association Definitions for your slug to see what it is allowed to link to.

Returns

The record that was created, including the id it was given, plus created_at and created_by.

POST /api/v1/objects/subscription/records
curl 'https://api.dreamteamcrm.ai/api/v1/objects/subscription/records' \
  -X POST \
  -H 'Authorization: Bearer <YOUR_TOKEN>' \
  -H 'Content-Type: application/json' \
  -d '{
    "properties": {
      "name": "Analytical Engines - Annual Plan",
      "start_date": "2026-11-01",
      "deal_ids": [1011624]
    }
  }'
{
  "id": 1048896,
  "type": "subscription",
  "properties": {
    "name": "Analytical Engines - Annual Plan",
    "start_date": "2026-11-01"
  },
  "created_at": "2026-11-05T10:00:00.000000Z",
  "updated_at": "2026-11-05T10:00:00.000000Z",
  "created_by": 1000052
}
Record created

Edit a record

PATCH /api/v1/objects/{object}/records/{id}

Send only the fields you want to change. Anything you leave out keeps the value it already had. Set the Content-Type header to application/merge-patch+json. The required and unique rules above still apply to any field you change, and you get the updated record back.

Path parameters

object string · requiredThe custom object's slug.
id integer · requiredNumeric identifier of the record to update.
PATCH /api/v1/objects/subscription/records/1048896
curl 'https://api.dreamteamcrm.ai/api/v1/objects/subscription/records/1048896' \
  -X PATCH \
  -H 'Authorization: Bearer <YOUR_TOKEN>' \
  -H 'Content-Type: application/merge-patch+json' \
  -d '{
    "properties": {
      "start_date": "2026-12-01"
    }
  }'
{
  "id": 1048896,
  "type": "subscription",
  "properties": {
    "name": "Analytical Engines - Annual Plan",
    "start_date": "2026-12-01"
  },
  "created_at": "2026-11-05T10:00:00.000000Z",
  "updated_at": "2026-11-05T14:30:00.000000Z",
  "created_by": 1000052
}
Record updated

Delete a record

DELETE /api/v1/objects/{object}/records/{id}

Deletes the record with that id. You get back 204 No Content with an empty body, so check the status code rather than looking for JSON. The delete is permanent, and there is no restore. You also get 204 when no record with that id exists, so repeating a delete is safe.

Path parameters

object string · requiredThe custom object's slug.
id integer · requiredNumeric identifier of the record to delete.
DELETE /api/v1/objects/subscription/records/1048896
curl 'https://api.dreamteamcrm.ai/api/v1/objects/subscription/records/1048896' \
  -X DELETE \
  -H 'Authorization: Bearer <YOUR_TOKEN>'
Record deleted - no content returned.