API reference

41 operations, generated from the same declaration the router dispatches on — so it cannot describe an endpoint that does not exist, or miss one that does. Paste a key to run any of them against your own data.

API reference

Every endpoint below is generated from the router itself, so it cannot drift out of date.

Used only by the “Try it” buttons on this page, in your browser. Create one in Settings → API keys.

Sign in to 360Nook and open Settings → API keys to create one.

POST/v1/contacts/bulkcontacts:write

Create many contacts at once from a pasted list, optionally tagging them all. Use this instead of calling create_contact repeatedly.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

Request body (JSON)
text
tags
Returns: createdskippedtagsreasons
curl -X POST /api/v1/contacts/bulk \
  -H "Authorization: Bearer nook_sk_your_key" \
  -H "Content-Type: application/json" \
  -d '{}'
Paste a key above to run this.
GET/v1/knowledgeknowledge:read

List what the AI assistant knows about this business.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

limitinteger

How many rows to return, 1–200. Values above 200 are clamped, not rejected.

cursorstring

Continue from a previous page. Pass the next_cursor you were given; treat it as opaque.

Returns: idquestionanswersourceenabledcreated_at
curl /api/v1/knowledge \
  -H "Authorization: Bearer nook_sk_your_key"
Paste a key above to run this.
POST/v1/conversation-ai-agentsknowledge:write

Build the Conversation AI agent from past conversations: learns the questions customers ask and the team's answers, then turns the agent on in SUGGESTIVE mode (a person approves every reply).

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

Request body (JSON)
conversations
days
channels
Returns: conversationsknowledge_addedchannelsagent_id
curl -X POST /api/v1/conversation-ai-agents \
  -H "Authorization: Bearer nook_sk_your_key" \
  -H "Content-Type: application/json" \
  -d '{}'
Paste a key above to run this.
POST/v1/knowledgeknowledge:write

Teach the AI assistant a question and its answer. Used on chat, email and the phone.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

Request body (JSON)
question
answer
Returns: idquestionanswersourceenabledcreated_at
curl -X POST /api/v1/knowledge \
  -H "Authorization: Bearer nook_sk_your_key" \
  -H "Content-Type: application/json" \
  -d '{}'
Paste a key above to run this.
POST/v1/pipelinesopportunities:write

Create a pipeline with its stages, in order.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

Request body (JSON)
name
description
stages
Returns: idnamedescriptioncreated_at
curl -X POST /api/v1/pipelines \
  -H "Authorization: Bearer nook_sk_your_key" \
  -H "Content-Type: application/json" \
  -d '{}'
Paste a key above to run this.
GET/v1/contacts/:id/notescontacts:read

List the notes on a contact, newest first.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

limitinteger

How many rows to return, 1–200. Values above 200 are clamped, not rejected.

cursorstring

Continue from a previous page. Pass the next_cursor you were given; treat it as opaque.

Returns: idbodycreated_at
curl /api/v1/contacts/:id/notes \
  -H "Authorization: Bearer nook_sk_your_key"
Paste a key above to run this.
POST/v1/contacts/:id/notescontacts:write

Add a note to a contact.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

Request body (JSON)
body
Returns: idbodycreated_at
curl -X POST /api/v1/contacts/:id/notes \
  -H "Authorization: Bearer nook_sk_your_key" \
  -H "Content-Type: application/json" \
  -d '{}'
Paste a key above to run this.
GET/v1/taskstasks:read

List tasks, soonest due first. Completed ones are excluded by default.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

limitinteger

How many rows to return, 1–200. Values above 200 are clamped, not rejected.

cursorstring

Continue from a previous page. Pass the next_cursor you were given; treat it as opaque.

contact_iduuid

Only tasks about this contact.

include_completedstring

Pass "true" to include tasks already done.

Returns: idtitledescriptiondue_atcompletedcontact_idcreated_at
curl /api/v1/tasks \
  -H "Authorization: Bearer nook_sk_your_key"
Paste a key above to run this.
POST/v1/taskstasks:write

Create a task, optionally about a contact.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

Request body (JSON)
title
description
due_at
contact_id
Returns: idtitledescriptiondue_atcompletedcontact_idcreated_at
curl -X POST /api/v1/tasks \
  -H "Authorization: Bearer nook_sk_your_key" \
  -H "Content-Type: application/json" \
  -d '{}'
Paste a key above to run this.
POST/v1/tasks/:id/completetasks:write

Mark a task done.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

Returns: idtitlecompletedcreated_at
curl -X POST /api/v1/tasks/:id/complete \
  -H "Authorization: Bearer nook_sk_your_key" \
  -H "Content-Type: application/json" \
  -d '{}'
Paste a key above to run this.
GET/v1/contactscontacts:read

List contacts, newest first. Filter by search text and/or a tag.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

limitinteger

How many rows to return, 1–200. Values above 200 are clamped, not rejected.

cursorstring

Continue from a previous page. Pass the next_cursor you were given; treat it as opaque.

qstring

Case-insensitive search.

tagstring

Only contacts carrying this tag (case-insensitive).

Returns: idfirst_namelast_nameemailphonetagscreated_at
curl /api/v1/contacts \
  -H "Authorization: Bearer nook_sk_your_key"
Paste a key above to run this.
GET/v1/opportunitiesopportunities:read

List opportunities, newest first. Deleted ones are excluded.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

limitinteger

How many rows to return, 1–200. Values above 200 are clamped, not rejected.

cursorstring

Continue from a previous page. Pass the next_cursor you were given; treat it as opaque.

pipeline_iduuid

Only opportunities in this pipeline.

stage_iduuid

Only opportunities in this stage.

statusstring

Only opportunities with this status: open, won, lost or abandoned.

Returns: idtitlevaluecurrencystatuspipeline_idstage_idcontact_idcreated_at
curl /api/v1/opportunities \
  -H "Authorization: Bearer nook_sk_your_key"
Paste a key above to run this.
GET/v1/pipelinesopportunities:read

List pipelines.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

limitinteger

How many rows to return, 1–200. Values above 200 are clamped, not rejected.

cursorstring

Continue from a previous page. Pass the next_cursor you were given; treat it as opaque.

Returns: idnamedescriptionis_defaultsort_order
curl /api/v1/pipelines \
  -H "Authorization: Bearer nook_sk_your_key"
Paste a key above to run this.
GET/v1/calendarscalendars:read

List calendars. Deleted ones are excluded.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

limitinteger

How many rows to return, 1–200. Values above 200 are clamped, not rejected.

cursorstring

Continue from a previous page. Pass the next_cursor you were given; treat it as opaque.

Returns: idnameslugtimezoneslot_durationis_active
curl /api/v1/calendars \
  -H "Authorization: Bearer nook_sk_your_key"
Paste a key above to run this.
GET/v1/appointmentscalendars:read

List appointments, soonest first.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

limitinteger

How many rows to return, 1–200. Values above 200 are clamped, not rejected.

cursorstring

Continue from a previous page. Pass the next_cursor you were given; treat it as opaque.

calendar_iduuid

Only appointments on this calendar.

Returns: idtitlestarts_atends_atstatuscalendar_idcontact_id
curl /api/v1/appointments \
  -H "Authorization: Bearer nook_sk_your_key"
Paste a key above to run this.
GET/v1/conversationsconversations:read

List conversations, most recently active first.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

limitinteger

How many rows to return, 1–200. Values above 200 are clamped, not rejected.

cursorstring

Continue from a previous page. Pass the next_cursor you were given; treat it as opaque.

Returns: idcontact_idlast_message_atlast_message_previewmessage_countstarred
curl /api/v1/conversations \
  -H "Authorization: Bearer nook_sk_your_key"
Paste a key above to run this.
GET/v1/workflowsworkflows:read

List workflows. Deleted ones are excluded.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

limitinteger

How many rows to return, 1–200. Values above 200 are clamped, not rejected.

cursorstring

Continue from a previous page. Pass the next_cursor you were given; treat it as opaque.

Returns: idnamedescriptionactive_enrolledtotal_enrolledlast_run_at
curl /api/v1/workflows \
  -H "Authorization: Bearer nook_sk_your_key"
Paste a key above to run this.
POST/v1/workflowsworkflows:write

Create a workflow from a trigger and an ordered list of actions. Created as a draft; publish it in the builder.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

Request body (JSON)
name
description
trigger
trigger_config
steps
Returns: idnamestatuswarnings
curl -X POST /api/v1/workflows \
  -H "Authorization: Bearer nook_sk_your_key" \
  -H "Content-Type: application/json" \
  -d '{}'
Paste a key above to run this.
POST/v1/workflows/custom-triggerworkflows:write

Fire a custom trigger: every published workflow listening for this event name starts for the contact, with data available as {{trigger.<key>}}.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

Request body (JSON)
event
contact_id
email
phone
data
Returns: eventcontact_idaccepted
curl -X POST /api/v1/workflows/custom-trigger \
  -H "Authorization: Bearer nook_sk_your_key" \
  -H "Content-Type: application/json" \
  -d '{}'
Paste a key above to run this.
POST/v1/contactscontacts:write

Create a contact.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

Request body (JSON)
first_name
last_name
email
phone
Returns: idfirst_namelast_nameemailphonecreated_at
curl -X POST /api/v1/contacts \
  -H "Authorization: Bearer nook_sk_your_key" \
  -H "Content-Type: application/json" \
  -d '{}'
Paste a key above to run this.
PATCH/v1/contacts/:idcontacts:write

Update a contact. Only the fields you send are changed.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

Request body (JSON)
first_name
last_name
email
phone
Returns: idfirst_namelast_nameemailphonecreated_at
curl -X PATCH /api/v1/contacts/:id \
  -H "Authorization: Bearer nook_sk_your_key" \
  -H "Content-Type: application/json" \
  -d '{}'
Paste a key above to run this.
POST/v1/opportunitiesopportunities:write

Create an opportunity.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

Request body (JSON)
title
value
currency
pipeline_id
stage_id
contact_id
status
lost_reason
Returns: idtitlevaluecurrencypipeline_idstage_idcontact_idstatuscreated_at
curl -X POST /api/v1/opportunities \
  -H "Authorization: Bearer nook_sk_your_key" \
  -H "Content-Type: application/json" \
  -d '{}'
Paste a key above to run this.
PATCH/v1/opportunities/:idopportunities:write

Update an opportunity — move its stage, change its value, win or lose it.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

Request body (JSON)
title
value
currency
pipeline_id
stage_id
contact_id
status
lost_reason
Returns: idtitlevaluecurrencypipeline_idstage_idcontact_idstatuscreated_at
curl -X PATCH /api/v1/opportunities/:id \
  -H "Authorization: Bearer nook_sk_your_key" \
  -H "Content-Type: application/json" \
  -d '{}'
Paste a key above to run this.
POST/v1/appointmentscalendars:write

Book an appointment. Availability is checked; a taken slot is refused, not queued.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

Request body (JSON)
calendar_id
starts_at
contact_id
guest_name
guest_email
guest_phone
notes
timezone
status
cancel_reason
Returns: idcalendar_idstarts_atends_atstatuscontact_id
curl -X POST /api/v1/appointments \
  -H "Authorization: Bearer nook_sk_your_key" \
  -H "Content-Type: application/json" \
  -d '{}'
Paste a key above to run this.
PATCH/v1/appointments/:idcalendars:write

Reschedule an appointment, cancel it, or record whether they showed.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

Request body (JSON)
calendar_id
starts_at
contact_id
guest_name
guest_email
guest_phone
notes
timezone
status
cancel_reason
Returns: idcalendar_idstarts_atends_atstatuscontact_id
curl -X PATCH /api/v1/appointments/:id \
  -H "Authorization: Bearer nook_sk_your_key" \
  -H "Content-Type: application/json" \
  -d '{}'
Paste a key above to run this.
POST/v1/marketplace/billing/chargescharges:write

Charge the account's wallet on one of your app's billing meters: price per unit × units. The same eventId is charged once; no funds → refused, nothing charged.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

Request body (JSON)
meterId
units
price
eventId
userId
description
eventTime
Returns: idmeterIdeventIdunitspriceamountcurrencyeventTimerefundedduplicate
curl -X POST /api/v1/marketplace/billing/charges \
  -H "Authorization: Bearer nook_sk_your_key" \
  -H "Content-Type: application/json" \
  -d '{}'
Paste a key above to run this.
GET/v1/marketplace/appsmarketplace:read

Apps from the App Marketplace this account can install or already has (search with query) — what to suggest when someone asks for an integration. Respects the agency's Marketplace Settings.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

querystring

Words to look for in the app's name, developer or description.

Returns: appsnote
curl /api/v1/marketplace/apps \
  -H "Authorization: Bearer nook_sk_your_key"
Paste a key above to run this.
GET/v1/marketplace/billing/chargescharges:read

Your app's wallet charges on this account (filters: meterId, eventId, userId, startDate, endDate; skip, limit).

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

Returns: datalimitskip
curl /api/v1/marketplace/billing/charges \
  -H "Authorization: Bearer nook_sk_your_key"
Paste a key above to run this.
GET/v1/marketplace/billing/charges/has-fundscharges:read

Whether the account's wallet has funds for usage charges.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

Returns: hasFundsbalancecurrency
curl /api/v1/marketplace/billing/charges/has-funds \
  -H "Authorization: Bearer nook_sk_your_key"
Paste a key above to run this.
GET/v1/marketplace/billing/charges/:idcharges:read

One of your app's wallet charges.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

Returns: idmeterIdeventIdunitspriceamountcurrencyeventTimerefunded
curl /api/v1/marketplace/billing/charges/:id \
  -H "Authorization: Bearer nook_sk_your_key"
Paste a key above to run this.
DELETE/v1/marketplace/billing/charges/:idcharges:write

Delete (refund) one of your app's wallet charges: the amount goes back to the account's wallet.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

Returns: okalreadyRefunded
curl -X DELETE /api/v1/marketplace/billing/charges/:id \
  -H "Authorization: Bearer nook_sk_your_key" \
  -H "Content-Type: application/json" \
  -d '{}'
Paste a key above to run this.
POST/v1/payments/custom-provider/connectpayments:write

Connect this app's payment gateway on the account: the test and live keys the app uses to recognise our calls.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

Request body (JSON)
test
live
Returns: okprovidermode
curl -X POST /api/v1/payments/custom-provider/connect \
  -H "Authorization: Bearer nook_sk_your_key" \
  -H "Content-Type: application/json" \
  -d '{}'
Paste a key above to run this.
GET/v1/payments/custom-provider/connectpayments:read

Read this app's gateway config on the account (keys are masked).

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

Returns: providermodetestlive
curl /api/v1/payments/custom-provider/connect \
  -H "Authorization: Bearer nook_sk_your_key"
Paste a key above to run this.
POST/v1/payments/custom-provider/disconnectpayments:write

Disconnect this app's gateway from the account.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

Request body (JSON)
liveMode
Returns: ok
curl -X POST /api/v1/payments/custom-provider/disconnect \
  -H "Authorization: Bearer nook_sk_your_key" \
  -H "Content-Type: application/json" \
  -d '{}'
Paste a key above to run this.
POST/v1/conversations/messages/inboundconversations:write

Add an inbound message from a conversation provider: an SMS or Email reply it received, or a Call log (inbound or outbound) for an existing contact.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

Request body (JSON)
type
phone
email
subject
contact_id
message
direction
status
duration_seconds
recording_url
external_id
contactId
conversationId
conversationProviderId
call
attachments
altId
date
Returns: okconversation_idmessage_idcall_idcontact_idduplicate
curl -X POST /api/v1/conversations/messages/inbound \
  -H "Authorization: Bearer nook_sk_your_key" \
  -H "Content-Type: application/json" \
  -d '{}'
Paste a key above to run this.
POST/v1/conversations/messages/outboundconversations:write

Add an external outbound call log from a Call conversation provider (GHL's payload).

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

Request body (JSON)
type
phone
contact_id
duration_seconds
recording_url
external_id
contactId
conversationId
conversationProviderId
call
attachments
altId
date
Returns: okconversation_idcall_idcontact_idduplicate
curl -X POST /api/v1/conversations/messages/outbound \
  -H "Authorization: Bearer nook_sk_your_key" \
  -H "Content-Type: application/json" \
  -d '{}'
Paste a key above to run this.
PATCH/v1/conversations/messages/statusconversations:write

Update an outbound message's delivery status (for the conversation provider that carried it).

Request body (JSON)
message_id
status
error
Returns: idstatus
curl -X PATCH /api/v1/conversations/messages/status \
  -H "Authorization: Bearer nook_sk_your_key" \
  -H "Content-Type: application/json" \
  -d '{}'
Paste a key above to run this.
POST/v1/conversations/messagesconversations:write

Send a message to a contact on email, SMS, WhatsApp or LINE.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

Request body (JSON)
contact_id
channel
body
subject
from_name
Returns: idconversation_idchanneldeliveredcode
curl -X POST /api/v1/conversations/messages \
  -H "Authorization: Bearer nook_sk_your_key" \
  -H "Content-Type: application/json" \
  -d '{}'
Paste a key above to run this.
GET/v1/contacts/:idcontacts:read

Fetch one contact.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

Returns: idfirst_namelast_nameemailphonecreated_at
curl /api/v1/contacts/:id \
  -H "Authorization: Bearer nook_sk_your_key"
Paste a key above to run this.
GET/v1/opportunities/:idopportunities:read

Fetch one opportunity.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

Returns: idtitlevaluecurrencypipeline_idstage_idcontact_idstatuscreated_at
curl /api/v1/opportunities/:id \
  -H "Authorization: Bearer nook_sk_your_key"
Paste a key above to run this.
GET/v1/appointments/:idcalendars:read

Fetch one appointment.

ParameterValue
sub_account_iduuid

Act on one of your sub-accounts. Agency keys only — a sub-account key is already scoped and does not need it.

Returns: idcalendar_idstarts_atends_atstatuscontact_id
curl /api/v1/appointments/:id \
  -H "Authorization: Bearer nook_sk_your_key"
Paste a key above to run this.
API reference · 360Nook