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
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.
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 objectsList a custom object's 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 integer | 1-based page index. Defaults to 1. |
page_size integer | Records per page (1-100). Defaults to 20. |
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
}
}Add a record
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.
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
}Edit a record
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 · required | The custom object's slug. |
id integer · required | Numeric identifier of the record to update. |
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
}Delete a record
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 · required | The custom object's slug. |
id integer · required | Numeric identifier of the record to delete. |
curl 'https://api.dreamteamcrm.ai/api/v1/objects/subscription/records/1048896' \
-X DELETE \
-H 'Authorization: Bearer <YOUR_TOKEN>'