Skip to content

Object types

Ahoy’s schema is per-organisation, so the authoritative list of what your credential can reach is always:

Terminal window
curl https://api.ahoy.ai/rest/v1/objects/ \
-H "Authorization: Bearer $AHOY_API_KEY"

This page is the vocabulary you can expect to meet there. Treat it as a map, not a contract: your org may have custom types, and a type you can see in the app may not be granted to a given key.

The four you will spend nearly all your time with. All are fully writable.

TypeLabelWhat it is
ahoy_contactContactAn individual person. Created from inbound email, manual entry, CSV import or enrichment
ahoy_companyCompanyAn organisation, identified by domain. The root that groups contacts, deals and risks
ahoy_dealDealA sales opportunity moving through pipeline stages
ahoy_noteNoteA note attached to other records — also Ahoy’s task object, see below

Below is the default shape of each core record. Your org can add properties (and rename labels), so treat this as the starting vocabulary, not the full list — GET /rest/v1/objects/ahoy_contact/ returns the authoritative properties for a type, including anything your org has added.

A person. ahoy_email and ahoy_phone_number hold multiple values, so both are arrays even when you only have one.

{
"properties": {
"ahoy_first_name": "Ada",
"ahoy_last_name": "Lovelace",
"ahoy_email": ["ada@example.com"],
"ahoy_job_title": "VP Engineering",
"ahoy_linkedin_url": "https://www.linkedin.com/in/adalovelace",
"ahoy_phone_number": [
{ "country_code": "GB", "national_number": "2079460123" }
]
}
}

Also available: ahoy_headline, ahoy_summary, ahoy_location, ahoy_timezone, ahoy_job_start_date, ahoy_lead_score, ahoy_linkedin_id, ahoy_first_web_source, ahoy_last_web_source.

Read-only: ahoy_created_at, ahoy_updated_at, ahoy_last_activity_at, ahoy_potential_deal_total, ahoy_weighted_deal_total.

An organisation, identified by domain. Note that the numeric properties are sent as strings.

{
"properties": {
"ahoy_name": "Acme Corp",
"ahoy_domain": "acme.com",
"ahoy_industry": "Software",
"ahoy_city": "Dublin",
"ahoy_country": "Ireland",
"ahoy_employee_count": "250",
"ahoy_annual_revenue": "4200000"
}
}

Also available: ahoy_website, ahoy_description, ahoy_linkedin_url, ahoy_company_type, ahoy_year_founded, ahoy_headcount_range, ahoy_region, ahoy_country_code, ahoy_postal_code, ahoy_address.

Read-only: ahoy_created_at, ahoy_updated_at, ahoy_stripe_mrr_total, ahoy_stripe_subscription_count.

A sales opportunity. Deals carry few properties by design — the interesting state lives in the stage association, not in a field.

{
"properties": {
"ahoy_name": "Acme Corp — platform rollout",
"ahoy_amount": { "amount": "48000", "unit": "USD" },
"ahoy_close_date": "2026-03-31"
}
}

Read-only: ahoy_created_at, ahoy_updated_at, ahoy_last_activity_at.

Sending the right type matters more here than in most CRM APIs, because values are validated against the property’s field type rather than coerced.

ShapeExample propertiesSend
Multi-valuedahoy_email, ahoy_phone_numberAn array, even for a single value
Numberahoy_employee_count, ahoy_annual_revenueA numeric string"250", never 250
Currencyahoy_amount{ "amount": "48000", "unit": "USD" }
Dateahoy_close_date"YYYY-MM-DD"
Datetimeahoy_created_atISO 8601 with an offset"2026-03-31T14:30:00Z"
Phoneahoy_phone_number{ "country_code": "GB", "national_number": "2079460123" }
Selectahoy_lead_scoreThe option’s exact value, not its display label

GET /rest/v1/field_types/ is the authority on every shape, including which operators and aggregations each one supports.

The records above are independent until you associate them. The three you will reach for most:

AssociationMeaning
ahoy_contact_to_companyThe contact works at the company
ahoy_deal_to_companyThe deal belongs to the company
ahoy_deal_to_contactThe people on the deal

A deal’s position in its pipeline is an association too — you move a deal by pointing ahoy_deal_to_deal_pipeline_stage at a different stage record, not by writing a “stage” property. The same is true of a contact’s lifecycle (ahoy_contact_to_lifecycle_stage).

Terminal window
curl -X PUT \
https://api.ahoy.ai/rest/v1/objects/ahoy_deal/records/$DEAL_ID/associations/ahoy_deal_to_deal_pipeline_stage/$STAGE_ID/ \
-H "Authorization: Bearer $AHOY_API_KEY"

Pipelines are records too, which means you read them over the same endpoints — there is no special “metadata” API. To move a deal, you associate it with the stage record you want.

TypeLabelWhat it is
ahoy_deal_pipelineDeal PipelineAn ordered sequence of deal stages
ahoy_deal_pipeline_stageDeal Pipeline StageOne stage within a deal pipeline
ahoy_note_pipelineTask StatusesThe workflow pipeline for notes
ahoy_note_pipeline_stageTask StatusOne status — To Do, In Progress, Complete
ahoy_contact_lifecycle_stageContact Lifecycle StageWhere a contact sits from awareness through to customer
ahoy_stage_timerStage TimerHow long a record spent in a stage. Written automatically

These originate in a connected system, so Ahoy owns their content. Most accept no writes at all; ahoy_meeting accepts associate only, so you can link a meeting to a contact without editing the meeting itself.

TypeLabelAccepts
ahoy_meetingMeetingassociate only
ahoy_meeting_notesMeeting Notesnothing
ahoy_email_threadEmail Threadnothing
ahoy_bookingBookingnothing
ahoy_booking_typeBooking Typenothing
ahoy_fileFilenothing

Unlike synced activity, these are deliberately writable — they exist so an integration can record an interaction that happened somewhere Ahoy cannot see.

TypeLabel
ahoy_callCall
ahoy_sms_conversationSMS Conversation
ahoy_linkedin_conversationLinkedIn Conversation

Generated by Ahoy rather than written by integrations, and read-only on this surface even when your grants would otherwise allow a write.

TypeLabel
ahoy_riskRisk
ahoy_web_visitWeb Visit
ahoy_web_visitorWeb Visitor

Your organisation also contains platform records — schema definitions, access control, automation, and operational history. Whether any of them are reachable depends entirely on your credential’s grants, and most integrations neither need nor receive them.

GET /rest/v1/objects/ is the answer, always: it returns exactly the types your key can see, with the operations each one allows.

ahoy_user and ahoy_org are granted read access implicitly so that owner-visibility and org-visibility associations resolve — but they are deliberately not exposed as resources. They are not listed, not queryable, and not readable by id.

Anything your org has defined itself appears alongside the built-ins with the same operations and the same URL shape. That is the point of the design: there is no separate endpoint for custom objects, so an integration written against ahoy_contact works unchanged against my_custom_type.