Resources

Records

Records are the core objects in Dreamteam CRM. Contacts, companies, deals, meetings, notes, and tasks are all records, as is every custom object you define. These endpoints work the same way for each: you change the object type in the path, and the request and response shapes stay the same. The examples below use contacts, companies, and deals.

Some object types add their own rules or endpoints

The routes here cover every object type, and you create, edit, and delete each one the same way. A few types layer extra behaviour on top: tasks, for example, must be linked to a record and are handed over through a dedicated reassignment endpoint - see Tasks. Records of your own custom objects use these same routes with the custom object's slug in the path - see Custom objects.

The record model

A record has a stable numeric id, an object type it belongs to (like contact or deal), and a bag of properties whose shape depends on the object type. Optionally, a record can carry an associations block that embeds linked records grouped by type.

AI-generated fields live inside properties, next to the schema fields. Text-heavy ones are prefixed ai_ (e.g. ai_about, ai_exec_summary) and come back as a JSON string encoding a card - { "title", "icon_category", "content": [...], "metadata" } - which some fields return as an array. Scalar signals such as engagement, confidence, risk, and icp are plain values. All are read-only and populated asynchronously, so a freshly-created record returns them empty or absent.

Properties

AttributeDescription
idNumeric identifier for the record. Stable across the record's lifetime.
typeThe object type - contact, company, deal, meeting, note, or task, plus any custom object type you define.
propertiesObject of key-value pairs. Keys are property names from the object's schema; values match the property's data type.
ai_* read-onlyAI-generated fields, nested inside properties. Text fields (prefixed ai_) are JSON-string cards; scalar signals (e.g. engagement, icp, confidence) are plain values. Populated asynchronously - empty or absent on a new record.
associationsOptional. Present when the request opts into embedding. Grouped by object type, with a records array and per-type metadata.
created_atISO 8601 timestamp when the record was created.
updated_atISO 8601 timestamp of the last property change.
created_byUser id of the record's creator.
{
  "id": 1015634,
  "type": "contact",
  "properties": {
    "first_name": "Ada",
    "last_name": "Chen",
    "email": "ada@example.com",
    "owner_id": 1000052,
    "engagement": "Medium",
    "ai_exec_summary": "[{\"title\":\"Executive Summary\",\"icon_category\":\"executive_summary\",\"content\":[{\"icon_category\":\"briefcase\",\"value\":\"Contact at Analytical Engines Ltd; captured from an inbound email.\"},{\"icon_category\":\"target\",\"value\":\"Next best step: a discovery call to confirm needs and timeline.\"}]}]",
    "ai_about": "{\"title\":\"About Ada Chen\",\"icon_category\":\"contact_overview\",\"content\":[{\"icon_category\":\"briefcase\",\"value\":\"Contact at Analytical Engines Ltd, reachable at ada@example.com.\"}],\"metadata\":{\"tags\":[{\"icon_category\":\"map_pin\",\"value\":\"Cambridge, UK\"}],\"links\":[]}}"
  },
  "created_at": "2026-06-29T10:23:27.444871Z",
  "updated_at": "2026-06-29T10:23:35.757096Z",
  "created_by": 1000052
}

List records

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

Lists the contacts, companies, deals, meetings or notes you have access to, a page at a time. Pass the object type in the URL path. Pass associations query parameters (repeatable) to embed linked records under each returned record's associations block. Omit them to get properties only.

Path parameters

object string · requiredObject type - one of contact, company, deal, meeting, note, task, or a custom object.

Query parameters

page integerPage number, starts at 1. Defaults to 1.
page_size integerRecords per page, up to 100. Defaults to 20.
associations string[]Object types to embed under each record. Repeatable - e.g. ?associations=company&associations=note. Omit to skip embedding.

Returns

A paginated list of records under results, plus a metadata object with page, page_size, total_elements, total_pages, has_next, and has_previous.

Object
GET /api/v1/objects/{object}/records
curl 'https://api.dreamteamcrm.ai/api/v1/objects/contact/records?page=1&page_size=20&associations=company&associations=note' \
  -H 'Authorization: Bearer <YOUR_TOKEN>'
curl 'https://api.dreamteamcrm.ai/api/v1/objects/company/records?page=1&page_size=20&associations=contact&associations=deal' \
  -H 'Authorization: Bearer <YOUR_TOKEN>'
curl 'https://api.dreamteamcrm.ai/api/v1/objects/deal/records?page=1&page_size=20&associations=company&associations=contact' \
  -H 'Authorization: Bearer <YOUR_TOKEN>'
{
  "results": [
    {
      "id": 1015634,
      "type": "contact",
      "properties": {
        "first_name": "Ada",
        "last_name": "Chen",
        "email": "ada@example.com",
        "source": "Email",
        "owner_id": 1000052,
        "contact_activity_status": "New",
        "engagement": "Medium",
        "ai_about": "{\"title\":\"About Ada Chen\",\"icon_category\":\"contact_overview\",\"content\":[{\"icon_category\":\"briefcase\",\"value\":\"Contact at Analytical Engines Ltd; captured from an inbound email.\"}]}"
      },
      "associations": {
        "company": {
          "records": [
            {
              "id": 1011597,
              "association_name": "company_contact_assoc"
            }
          ],
          "metadata": {
            "total": 1,
            "has_more": false
          }
        },
        "note": {
          "records": [
            {
              "id": 1005567,
              "association_name": "contact_notes_assoc"
            },
            {
              "id": 1005568,
              "association_name": "contact_notes_assoc"
            }
          ],
          "metadata": {
            "total": 2,
            "has_more": false
          }
        }
      },
      "created_at": "2026-06-29T10:23:27.444871Z",
      "updated_at": "2026-06-29T10:23:35.757096Z",
      "created_by": 1000052
    }
  ],
  "metadata": {
    "page": 1,
    "page_size": 20,
    "total_elements": 1,
    "total_pages": 1,
    "has_next": false,
    "has_previous": false
  }
}
{
  "results": [
    {
      "id": 1011597,
      "type": "company",
      "properties": {
        "name": "Analytical Engines Ltd",
        "domain": "analytical-engines.com",
        "industry": "Hardware",
        "owner_id": 1000052,
        "icp": "Strong Fit",
        "ai_about": "{\"title\":\"About Analytical Engines Ltd\",\"icon_category\":\"company_overview\",\"content\":[{\"icon_category\":\"building\",\"value\":\"Hardware company; mid-market; UK-based.\"}]}"
      },
      "associations": {
        "contact": {
          "records": [
            {
              "id": 1015634,
              "association_name": "company_contact_assoc"
            },
            {
              "id": 1015635,
              "association_name": "company_contact_assoc"
            }
          ],
          "metadata": {
            "total": 2,
            "has_more": false
          }
        },
        "deal": {
          "records": [
            {
              "id": 1011624,
              "association_name": "company_deal_assoc"
            }
          ],
          "metadata": {
            "total": 1,
            "has_more": false
          }
        }
      },
      "created_at": "2026-05-20T11:00:00Z",
      "updated_at": "2026-06-12T08:13:25.348504Z",
      "created_by": 1000052
    }
  ],
  "metadata": {
    "page": 1,
    "page_size": 20,
    "total_elements": 1,
    "total_pages": 1,
    "has_next": false,
    "has_previous": false
  }
}
{
  "results": [
    {
      "id": 1011624,
      "type": "deal",
      "properties": {
        "name": "Analytical Engines - Q3",
        "amount": 100000.0,
        "stage_id": 1000003,
        "pipeline_id": 1000000,
        "owner_id": 1000052,
        "confidence": "Medium",
        "ai_deal_qualification": "{\"qualification_framework\":{\"framework_type\":\"MEDDPICC\",\"overall_score\":42,\"components\":[{\"title\":\"Metrics\",\"status\":\"Identified\",\"score\":60},{\"title\":\"Economic Buyer\",\"status\":\"Unknown\",\"score\":0}]}}"
      },
      "associations": {
        "company": {
          "records": [
            {
              "id": 1011597,
              "association_name": "company_deal_assoc"
            }
          ],
          "metadata": {
            "total": 1,
            "has_more": false
          }
        },
        "contact": {
          "records": [
            {
              "id": 1015634,
              "association_name": "contact_deal_assoc"
            },
            {
              "id": 1015635,
              "association_name": "contact_deal_assoc"
            }
          ],
          "metadata": {
            "total": 2,
            "has_more": false
          }
        }
      },
      "created_at": "2026-05-20T13:00:55.857056Z",
      "updated_at": "2026-06-12T08:13:25.348504Z",
      "created_by": 1000052
    }
  ],
  "metadata": {
    "page": 1,
    "page_size": 20,
    "total_elements": 1,
    "total_pages": 1,
    "has_next": false,
    "has_previous": false
  }
}
Paginated record list.

Create a record

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

Creates a single record - pass the object type in the URL path. You can create the standard CRM record types contact, company, deal, note, and task, plus records of any custom object type. A note needs only its content (optional) and can be created with or without a linked record. The request body's properties object must satisfy that type's schema for required fields; unknown property keys are rejected. Some types are read-only through this API - recording records, for instance, are ingested by call and meeting integrations and reject direct creation.

Associations at create time

Link the new record to existing records by setting the object's lookup fields inside properties - there is no separate associations array. A lookup field is named <object>_ids and takes the target record id(s); a deal, for example, accepts company_ids and contact_ids. Call the Schema endpoint to see which lookup fields an object supports.

Naming heads-up: the lookup field you write (e.g. company_ids) maps to an association whose full identifier surfaces elsewhere as association_name (e.g. "company_deal_assoc"). To read a record's linked records back, pass the associations query parameter on Find Records or Retrieve.

Path parameters

object string · requiredObject type to create the record under.

Request body

properties object · requiredObject matching the target object's schema. Required fields must be present. To link related records, set the object's lookup fields here (e.g. company_ids, contact_ids).

Returns

The created record, including its assigned id, created_at, and created_by.

Object
POST /api/v1/objects/{object}/records
curl 'https://api.dreamteamcrm.ai/api/v1/objects/contact/records' \
  -X POST \
  -H 'Authorization: Bearer <YOUR_TOKEN>' \
  -H 'Content-Type: application/json' \
  -d '{
    "properties": {
      "first_name": "Ada",
      "last_name": "Chen",
      "email": "ada@example.com"
    }
  }'
curl 'https://api.dreamteamcrm.ai/api/v1/objects/company/records' \
  -X POST \
  -H 'Authorization: Bearer <YOUR_TOKEN>' \
  -H 'Content-Type: application/json' \
  -d '{
    "properties": {
      "name": "Analytical Engines Ltd",
      "domain": "analytical-engines.com",
      "industry": "Hardware"
    }
  }'
curl 'https://api.dreamteamcrm.ai/api/v1/objects/deal/records' \
  -X POST \
  -H 'Authorization: Bearer <YOUR_TOKEN>' \
  -H 'Content-Type: application/json' \
  -d '{
    "properties": {
      "name": "Analytical Engines - Q3",
      "amount": 100000,
      "expected_close_date": "2026-09-19",
      "company_ids": [1011597],
      "contact_ids": [1015634],
      "stage_id": 1000003,
      "pipeline_id": 1000000
    }
  }'
curl 'https://api.dreamteamcrm.ai/api/v1/objects/note/records' \
  -X POST \
  -H 'Authorization: Bearer <YOUR_TOKEN>' \
  -H 'Content-Type: application/json' \
  -d '{
    "properties": {
      "content": "Met Ada at the Cambridge conference; wants a follow-up demo.",
      "contact_ids": [1015634]
    }
  }'
{
  "id": 1015634,
  "type": "contact",
  "properties": {
    "first_name": "Ada",
    "last_name": "Chen",
    "email": "ada@example.com",
    "owner_id": 1000052,
    "contact_activity_status": "New"
  },
  "created_at": "2026-06-30T10:58:41.740762Z",
  "updated_at": "2026-06-30T10:58:41.740762Z",
  "created_by": 1000052
}
{
  "id": 1011597,
  "type": "company",
  "properties": {
    "name": "Analytical Engines Ltd",
    "domain": "analytical-engines.com",
    "industry": "Hardware",
    "owner_id": 1000052
  },
  "created_at": "2026-06-30T10:58:41.740762Z",
  "updated_at": "2026-06-30T10:58:41.740762Z",
  "created_by": 1000052
}
{
  "id": 1011624,
  "type": "deal",
  "properties": {
    "name": "Analytical Engines - Q3",
    "amount": 100000.0,
    "expected_close_date": "2026-09-19T00:00:00Z",
    "stage_id": 1000003,
    "pipeline_id": 1000000,
    "owner_id": 1000052
  },
  "created_at": "2026-06-30T10:58:41.740762Z",
  "updated_at": "2026-06-30T10:58:41.740762Z",
  "created_by": 1000052
}
{
  "id": 1021044,
  "type": "note",
  "properties": {
    "content": "Met Ada at the Cambridge conference; wants a follow-up demo."
  },
  "created_at": "2026-11-05T10:00:00.000000Z",
  "updated_at": "2026-11-05T10:00:00.000000Z",
  "created_by": 1000052
}
Record created

Retrieve a record

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

Fetches a single contact, company, deal, meeting, or note by its id. By default the sample request embeds linked company and contact records - omit the associations query params to get a plain record with only its properties.

Path parameters

object string · requiredObject type of the record.
id integer · requiredNumeric identifier of the record.

Query parameters

associations string[]Object types to embed under associations. Repeatable. Omit to skip embedding.

Returns

The record. If associations was requested, a matching associations block is embedded - grouped by object type, each with a records array and per-type metadata (total, has_more). Embedded associations return ids only - see Hydrate by IDs for turning them into full records.

Paging associations past 100

Embedded associations are capped at 100 per type. If has_more: true, paginate the rest with the dedicated endpoint:

GET /api/v1/objects/{object}/records/{id}/associations/{target_type}?page=1&page_size=50

Read-only. Writing new association links is not available yet.

Fetching note content

Notes come back as {id, association_name} pairs. To get the actual note text, call Retrieve a Record with object=note and the note's id.

Object
GET /api/v1/objects/{object}/records/{id}
curl 'https://api.dreamteamcrm.ai/api/v1/objects/contact/records/1015634?associations=company&associations=note' \
  -H 'Authorization: Bearer <YOUR_TOKEN>'

# Fetch a linked note's content (a note is a record like any other)
curl 'https://api.dreamteamcrm.ai/api/v1/objects/note/records/1016384' \
  -H 'Authorization: Bearer <YOUR_TOKEN>'
curl 'https://api.dreamteamcrm.ai/api/v1/objects/company/records/1011597?associations=contact&associations=deal' \
  -H 'Authorization: Bearer <YOUR_TOKEN>'
curl 'https://api.dreamteamcrm.ai/api/v1/objects/deal/records/1011624?associations=company&associations=contact' \
  -H 'Authorization: Bearer <YOUR_TOKEN>'
curl 'https://api.dreamteamcrm.ai/api/v1/objects/note/records/1021044?associations=contact' \
  -H 'Authorization: Bearer <YOUR_TOKEN>'
{
  "id": 1015634,
  "type": "contact",
  "properties": {
    "first_name": "Ada",
    "last_name": "Chen",
    "email": "ada@example.com",
    "source": "Email",
    "owner_id": 1000052,
    "contact_activity_status": "New",
    "criticality": "Yes",
    "engagement": "Medium",
    "ai_about": "{\"title\":\"About Ada Chen\",\"icon_category\":\"contact_overview\",\"content\":[{\"icon_category\":\"briefcase\",\"value\":\"Contact at Analytical Engines Ltd; captured from an inbound email.\"}]}"
  },
  "associations": {
    "company": {
      "records": [
        {
          "id": 1011597,
          "association_name": "company_contact_assoc"
        }
      ],
      "metadata": {
        "total": 1,
        "has_more": false
      }
    },
    "note": {
      "records": [
        {
          "id": 1005567,
          "association_name": "contact_notes_assoc"
        },
        {
          "id": 1005568,
          "association_name": "contact_notes_assoc"
        }
      ],
      "metadata": {
        "total": 2,
        "has_more": false
      }
    }
  },
  "created_at": "2026-06-29T10:23:27.444871Z",
  "updated_at": "2026-06-29T10:23:35.757096Z",
  "created_by": 1000052
}
{
  "id": 1011597,
  "type": "company",
  "properties": {
    "name": "Analytical Engines Ltd",
    "domain": "analytical-engines.com",
    "industry": "Hardware",
    "owner_id": 1000052,
    "icp": "Strong Fit",
    "ai_about": "{\"title\":\"About Analytical Engines Ltd\",\"icon_category\":\"company_overview\",\"content\":[{\"icon_category\":\"building\",\"value\":\"Hardware company; mid-market; UK-based.\"}]}"
  },
  "associations": {
    "contact": {
      "records": [
        {
          "id": 1015634,
          "association_name": "company_contact_assoc"
        },
        {
          "id": 1015635,
          "association_name": "company_contact_assoc"
        }
      ],
      "metadata": {
        "total": 2,
        "has_more": false
      }
    },
    "deal": {
      "records": [
        {
          "id": 1011624,
          "association_name": "company_deal_assoc"
        }
      ],
      "metadata": {
        "total": 1,
        "has_more": false
      }
    }
  },
  "created_at": "2026-05-20T11:00:00Z",
  "updated_at": "2026-06-12T08:13:25.348504Z",
  "created_by": 1000052
}
{
  "id": 1011624,
  "type": "deal",
  "properties": {
    "name": "Analytical Engines - Q3",
    "amount": 100000.0,
    "expected_close_date": "2026-07-18T18:30:00Z",
    "stage_id": 1000003,
    "owner_id": 1000052,
    "pipeline_id": 1000000,
    "confidence": "Medium",
    "forecast_category": "Pipeline",
    "risk": "Medium",
    "status": "Red Flag",
    "last_activity_date": "2026-06-08T16:45:52Z",
    "ai_deal_qualification": "{\"qualification_framework\":{\"framework_type\":\"MEDDPICC\",\"overall_score\":42,\"components\":[{\"title\":\"Metrics\",\"status\":\"Identified\",\"score\":60},{\"title\":\"Economic Buyer\",\"status\":\"Unknown\",\"score\":0}]}}"
  },
  "associations": {
    "company": {
      "records": [
        {
          "id": 1011597,
          "association_name": "company_deal_assoc"
        }
      ],
      "metadata": {
        "total": 1,
        "has_more": false
      }
    },
    "contact": {
      "records": [
        {
          "id": 1015634,
          "association_name": "contact_deal_assoc"
        },
        {
          "id": 1015635,
          "association_name": "contact_deal_assoc"
        }
      ],
      "metadata": {
        "total": 2,
        "has_more": false
      }
    }
  },
  "created_at": "2026-05-20T13:00:55.857056Z",
  "updated_at": "2026-06-12T08:13:25.348504Z",
  "created_by": 1000052
}
{
  "id": 1021044,
  "type": "note",
  "properties": {
    "content": "Met Ada at the Cambridge conference; wants a follow-up demo."
  },
  "associations": {
    "contact": {
      "records": [
        {
          "id": 1015634,
          "association_name": "contact_notes_assoc"
        }
      ],
      "metadata": {
        "total": 1,
        "has_more": false
      }
    }
  },
  "created_at": "2026-11-05T10:00:00.000000Z",
  "updated_at": "2026-11-05T10:00:00.000000Z",
  "created_by": 1000052
}
Record found.

Update a record

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

Updates a record by merging the properties object in the request body into the record. Keys omitted from the body are left unchanged. Set a value to null to explicitly clear that field. Use Content-Type: application/merge-patch+json.

PATCH merges — the safe default

PATCH merges - only the fields you send change; everything else is left alone. Safe for partial updates.

About application/merge-patch+json: it's plain JSON with one rule the server enforces - only the keys you send actually change. Everything you leave out is untouched. Setting a value to null clears that field.

Path parameters

object string · requiredObject type of the record.
id integer · requiredNumeric identifier of the record.

Request body

properties object · requiredPartial property map. Keys present overwrite the record's current values; keys omitted are unchanged.

Returns

The updated record with its refreshed updated_at timestamp.

Object
PATCH /api/v1/objects/{object}/records/{id}
curl 'https://api.dreamteamcrm.ai/api/v1/objects/contact/records/1015634' \
  -X PATCH \
  -H 'Authorization: Bearer <YOUR_TOKEN>' \
  -H 'Content-Type: application/merge-patch+json' \
  -d '{
    "properties": {
      "email": "ada@example.com"
    }
  }'
curl 'https://api.dreamteamcrm.ai/api/v1/objects/company/records/1011597' \
  -X PATCH \
  -H 'Authorization: Bearer <YOUR_TOKEN>' \
  -H 'Content-Type: application/merge-patch+json' \
  -d '{
    "properties": {
      "industry": "Software"
    }
  }'
curl 'https://api.dreamteamcrm.ai/api/v1/objects/deal/records/1011624' \
  -X PATCH \
  -H 'Authorization: Bearer <YOUR_TOKEN>' \
  -H 'Content-Type: application/merge-patch+json' \
  -d '{
    "properties": {
      "stage_id": 1000004
    }
  }'
curl 'https://api.dreamteamcrm.ai/api/v1/objects/note/records/1021044' \
  -X PATCH \
  -H 'Authorization: Bearer <YOUR_TOKEN>' \
  -H 'Content-Type: application/merge-patch+json' \
  -d '{
    "properties": {
      "content": "Met Ada at the Cambridge conference; demo booked for Nov 12."
    }
  }'
{
  "id": 1015634,
  "type": "contact",
  "properties": {
    "first_name": "Ada",
    "last_name": "Chen",
    "email": "ada@example.com",
    "owner_id": 1000052,
    "contact_activity_status": "New",
    "engagement": "Medium",
    "ai_about": "{\"title\":\"About Ada Chen\",\"icon_category\":\"contact_overview\",\"content\":[{\"icon_category\":\"briefcase\",\"value\":\"Contact at Analytical Engines Ltd; captured from an inbound email.\"}]}"
  },
  "created_at": "2026-06-29T10:23:27.444871Z",
  "updated_at": "2026-07-10T09:15:22.501234Z",
  "created_by": 1000052
}
{
  "id": 1011597,
  "type": "company",
  "properties": {
    "name": "Analytical Engines Ltd",
    "domain": "analytical-engines.com",
    "industry": "Software",
    "owner_id": 1000052,
    "icp": "Strong Fit",
    "ai_about": "{\"title\":\"About Analytical Engines Ltd\",\"icon_category\":\"company_overview\",\"content\":[{\"icon_category\":\"building\",\"value\":\"Hardware company; mid-market; UK-based.\"}]}"
  },
  "created_at": "2026-05-20T11:00:00Z",
  "updated_at": "2026-07-10T09:15:22.501234Z",
  "created_by": 1000052
}
{
  "id": 1011624,
  "type": "deal",
  "properties": {
    "name": "Analytical Engines - Q3",
    "amount": 100000.0,
    "expected_close_date": "2026-07-18T18:30:00Z",
    "stage_id": 1000004,
    "owner_id": 1000052,
    "pipeline_id": 1000000,
    "confidence": "Medium",
    "forecast_category": "Pipeline",
    "ai_deal_qualification": "{\"qualification_framework\":{\"framework_type\":\"MEDDPICC\",\"overall_score\":42,\"components\":[{\"title\":\"Metrics\",\"status\":\"Identified\",\"score\":60},{\"title\":\"Economic Buyer\",\"status\":\"Unknown\",\"score\":0}]}}"
  },
  "created_at": "2026-05-20T13:00:55.857056Z",
  "updated_at": "2026-07-10T09:15:22.501234Z",
  "created_by": 1000052
}
{
  "id": 1021044,
  "type": "note",
  "properties": {
    "content": "Met Ada at the Cambridge conference; demo booked for Nov 12."
  },
  "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}

Permanently deletes a record by id. On success the endpoint returns 204 No Content with an empty body - and it returns the same 204 even when no record with that id exists, so a delete is safe to repeat. The URL is the same as Retrieve and Update; only the object slug and id change.

Deleting is permanent

There is no recycle bin and no restore endpoint - a deleted record cannot be recovered through the API. Records that exist only inside the one you delete, such as its notes, are removed with it.

A company with deals can't be deleted

Deleting a company that still has one or more deals attached returns 409 Conflict. Delete or move those deals first, then delete the company. Deleting a contact or a deal is never blocked this way.

Path parameters

object string · requiredObject type of the record - contact, company, deal, note, task, or a custom object.
id integer · requiredNumeric identifier of the record to delete.

Returns

204 No Content with an empty response body - there is no JSON to parse, so check the status code. Deleting a contact or a deal always returns 204. The one error you can hit is on a company: 409 Conflict while it still has deals attached (see below).

Object
DELETE /api/v1/objects/{object}/records/{id}
curl 'https://api.dreamteamcrm.ai/api/v1/objects/contact/records/1015634' \
  -X DELETE \
  -H 'Authorization: Bearer <YOUR_TOKEN>'
curl 'https://api.dreamteamcrm.ai/api/v1/objects/company/records/1011597' \
  -X DELETE \
  -H 'Authorization: Bearer <YOUR_TOKEN>'
curl 'https://api.dreamteamcrm.ai/api/v1/objects/deal/records/1011624' \
  -X DELETE \
  -H 'Authorization: Bearer <YOUR_TOKEN>'
curl 'https://api.dreamteamcrm.ai/api/v1/objects/note/records/1021044' \
  -X DELETE \
  -H 'Authorization: Bearer <YOUR_TOKEN>'
# 204 No Content
# The record was deleted. The response body is empty.
# You also get 204 if no record with that id exists.
Record deleted - no content returned. The same 204 comes back even if no record with that id exists.