completeTask
ChatGPTComplete a task Marks a task as completed. This triggers CRM sync and, for sequence tasks, automatically advances the prospect to the next step in the sequence.
By Nooks
Bring Nooks into ChatGPT so your revenue team can act on real execution data without pulling exports or switching tools. Query tasks, prospects, sequences, email activity, call transcripts, and rep metadata. Nooks is a revenue agent platform where AI agents and reps work in the same system, giving teams a direct line from agent activity to meetings booked, pipeline generated, and revenue closed.
owner is the workspace user who made the call. Asynchronous processing. A 202 response means that the request is valid. Nooks logs the call in the background, usually in less than one minute. To get the result, poll GET /v1/calls/{id}: - While Nooks logs the call, the response is 202 with status pending. - When Nooks has logged the call, the response is 200 with the call. - If a step fails, Nooks retries the step for approximately 4 hours. If logging still fails, the response is 202 with status failed and an error. After a failure, the owner sees the call in the failed call logs in Nooks. The owner can retry the call there. A retry sets status to pending again. A new request with the same Idempotency-Key does not retry the call. Result. Nooks logs the call in the same way as a call made in Nooks. The call shows in call history and in reporting. If you send a task, Nooks completes the task. Nooks also logs the call to the Salesforce or HubSpot account of the workspace. You cannot disable this. If you already log the call to the CRM, do not also send it here. If you do, the CRM gets two activities for one call. Fields. - prospect: an id from GET /v1/prospects. The prospect must be linked to Salesforce or HubSpot. If you send a task, prospect is optional. The call is then for the prospect of the task. - owner: a user id from GET /v1/users. With an API key, the owner can be any user in the workspace. With OAuth, the role of the caller sets which users can be the owner. - callDisposition: an id from GET /v1/callDispositions. These are Nooks sequencing dispositions. The workspace must use Nooks sequencing. - task: optional. An id from GET /v1/tasks. The task must be a one-off task or a call step of a sequence. The task must belong to owner. If you send prospect, the task must also belong to that prospect. The task must not be complete. - to and from: Nooks changes these numbers to E.164 format. Include the country code if the number is not a US number. If the prospect does not have the to number, Nooks adds it to the phone numbers of the prospect. - time: not more than 5 minutes in the future. - duration: in whole seconds. Recording. recordingUrl is optional. Nooks does not copy the file. Nooks transcribes the file one time, when it logs the call. The app and the CRM activity link to the URL. The URL must: - Use https. - Download from the public internet without authentication, cookies or headers. - Not expire. - Continue to work when Nooks adds query parameters. - Point to a WAV or MP3 file. Nooks transcribes a stereo file as one channel and identifies the speakers by their voices. Nooks rejects a URL that has a port, credentials or an IP address. Nooks also rejects a URL that contains nooks.in, nooks.ai, twilio.com, salesloft or hubspot. Anyone with the URL can play the recording. If Nooks cannot download the file, Nooks logs the call without a transcript. You must have consent to record the call. Idempotency. To retry a request safely, send an Idempotency-Key header. All requests with the same key get the same call id, and Nooks logs the call one time. A key belongs to your workspace. Use each key for only one call. After Nooks logs the call, the key returns that call for any request body. If you do not send a key, each request creates a new call.accountId (Nooks account id), externalAccountId (CRM account id), or accountToCreate for a company with no CRM account, whose existing account is reused when one is found and otherwise created first. People already in the CRM are matched, never duplicated. At most 25 people per call, each listed once. With dryRun true (the default) nothing is written: each person comes back will_create, will_update (already in the CRM, with the changes the write makes to the record), matched_existing (with prospectId), refused or failed (with reason), plus the account outcome for a company, and a previewId when there is something to write. The preview is what the user reviews before anything is written. With dryRun: false, the same people and account, and a previewId from the last 15 minutes, the people the preview marked will_create or will_update are written; each previewId works once, and a person added or changed since the preview is refused. Each person then comes back created, updated (its record changed as previewed) or matched_existing (with prospectId and crmId), refused or failed (with reason). Returned prospect ids are ready for sequence enrollment.ownerId), and optionally sends it immediately. Nooks creates a manual_email task for the prospect with a draft email attached, writes the given content to the draft, and, when send: true, submits it through the owner's connected mailbox, applying the workspace's deliverability safeguards (unsubscribe checks, pre-bounce validation, tracking, send spacing). With send: false (the default) the email is left as a draft the owner can review and send from Nooks. Recipients default to the prospect's primary email; pass recipients to override them (required when the prospect has no primary email). The sender defaults to the owner's default mailbox alias; pass from to use another of the owner's aliases. Not transactional: the draft is created before the send. If a send: true request returns 422 for a send-time rejection, the draft email and its manual_email task already exist in the owner's Nooks task list. Fix and resend from Nooks rather than retrying this endpoint, which would create a second draft.user role can only create sequences owned by themselves; admin and manager roles can create sequences for any user in the workspace. When that check fails (or owner.id is not a workspace member), OAuth callers receive 403 INSUFFICIENT_PERMISSION; API-key callers receive 422 for an unknown owner. To enroll prospects into the new sequence, use POST /v1/sequenceStates.privacy (returned by GET /v1/sequences/{id}): enroll into private sequences only on behalf of their owner.listCalls to discover call IDs. Only available for calls made by reps with an AI Coaching seat — calls made by unlicensed reps return an access-denied error. Very long transcripts are truncated, with a notice appended when that happens (truncated: true). Not every call has a transcript: when the recording was never transcribed, the response is hasTranscript: false with transcript: null (use listCalls with filter[hasTranscript]=true to list only calls that have one).GET /v1/emails, this endpoint also returns unsent drafts and queued sends (e.g. created via POST /v1/emails). Those come back with status: draft and type: null until the email actually sends.GET /v1/emailTemplates or the template reference on a sequence step (use GET /v1/sequenceSteps/{id}?include=template to inline the template DTO directly).200 confirms the credential is valid; 401 means it's expired, revoked, or malformed. - For OAuth callers, userId is the end user who authorized the token (JWT sub). - For API-key callers, userId is the Nooks user who generated the key on the API Keys page in Developer Settings. - userId is always populated. email and name are null if that user no longer has a seat in the workspace. - clientId and scopes are null for API-key callers (API keys have full workspace access). Response is intentionally flat as an introspection endpoint and doesn't follow the nested ReferenceObject shape the resource endpoints use. Available to any authenticated caller regardless of granted scopes.filter[account][id] on listCalls); use getAccount to resolve an account ID to its full record. Pagination: start with page[size]=25. Only request larger pages if you actually need more — responses above that threshold can be truncated or spilled to an attached file by MCP clients. Use the links.next cursor (page[after]) to page through results instead of increasing page[size].page[size]=25. Only request larger pages if you actually need more — responses above that threshold can be truncated or spilled to an attached file by MCP clients. Use the links.next cursor (page[after]) to page through results instead of increasing page[size].page[size]=25. Only request larger pages if you actually need more — responses above that threshold can be truncated or spilled to an attached file by MCP clients. Use the links.next cursor (page[after]) to page through results instead of increasing page[size].id and paginated with cursors. Each item includes the full subject and body. To fetch a single template, call GET /v1/emailTemplate/{id}, which uses the singular emailTemplate. By default the list returns only active templates. filter[archived]=true returns only archived ones. The list does not include the copies of a template that sequence steps make. To read one of those, call GET /v1/sequenceSteps/{id}?include=template. There is no name search. Narrow the list with the owner or updatedAt filters, or page through it. Pagination: start with page[size]=25. Only request larger pages if you actually need more — responses above that threshold can be truncated or spilled to an attached file by MCP clients. Use the links.next cursor (page[after]) to page through results instead of increasing page[size].POST /v1/emails with send: false) do not appear in this list until they are sent, including when filtering by id (filter[id] silently omits draft ids) or by filter[status]=draft. Fetch drafts by id via GET /v1/emails/{id}. filter[task][id] matches the sequence task that triggered the email. filter[account][id] joins through the email's prospect. Pagination: start with page[size]=25. Only request larger pages if you actually need more — responses above that threshold can be truncated or spilled to an attached file by MCP clients. Use the links.next cursor (page[after]) to page through results instead of increasing page[size].page[size]=25. Only request larger pages if you actually need more — responses above that threshold can be truncated or spilled to an attached file by MCP clients. Use the links.next cursor (page[after]) to page through results instead of increasing page[size].type), sequence enrollment, account, and updatedAt range. crmId is null for non-CRM prospects. When the same person exists as both a CRM-typed (salesforce/hubspot) record and an external-sequencing-platform record (outreach/salesloft/gong/apollo/groove), the CRM record is the canonical one — enrolling the other into a Nooks sequence resolves to the CRM record when it exists and is rejected when it does not. Pagination: start with page[size]=25. Only request larger pages if you actually need more — responses above that threshold can be truncated or spilled to an attached file by MCP clients. Use the links.next cursor (page[after]) to page through results instead of increasing page[size].filter[account][id] joins through the prospect. Pagination: start with page[size]=25. Only request larger pages if you actually need more — responses above that threshold can be truncated or spilled to an attached file by MCP clients. Use the links.next cursor (page[after]) to page through results instead of increasing page[size].page[size]=25. Only request larger pages if you actually need more — responses above that threshold can be truncated or spilled to an attached file by MCP clients. Use the links.next cursor (page[after]) to page through results instead of increasing page[size].page[size]=25. Only request larger pages if you actually need more — responses above that threshold can be truncated or spilled to an attached file by MCP clients. Use the links.next cursor (page[after]) to page through results instead of increasing page[size].filter[account][id] joins through the task's prospect. The updatedAt range is half-open: gte is inclusive, lt is exclusive. Pagination: start with page[size]=25. Only request larger pages if you actually need more — responses above that threshold can be truncated or spilled to an attached file by MCP clients. Use the links.next cursor (page[after]) to page through results instead of increasing page[size].listCalls as filter[team][id], or to searchConversations as hostTeamIds / participantTeamIds.User.Id / OwnerId). filter[crmId] returns an empty list if no Nooks user is mapped to that id. Pagination: start with page[size]=25. Only request larger pages if you actually need more — responses above that threshold can be truncated or spilled to an attached file by MCP clients. Use the links.next cursor (page[after]) to page through results instead of increasing page[size].transcriptQuery to find calls containing a keyword or phrase anywhere in the transcript, and/or speakerQuery (optionally scoped to the rep or prospect) to find a phrase in a single speaking turn. Returns the matching calls (most recent first) with the matching transcript snippets, so you can pull up the right calls to analyze or coach on — e.g. how a rep handled an objection, talked about pricing, or ran discovery. The transcript and speaker keyword search is what sets this apart from listCalls, which cannot search transcript text. Transcript/speaker queries are optional, so this also serves as a fast, relevance-ranked call search even when you only filter by time, prospect, account, disposition, outcome, minimum duration, owner, or team. SCOPE: only covers calls placed by reps with an AI Coaching seat — for a complete export of every call in the workspace (including unlicensed reps), use listCalls instead. Results are cursor-paginated and capped at 10,000 (totalCount is a lower bound, shown as "N+", once that cap is reached).noteIds (their own notes, most recent first) and a noteCount total, so fetch those with getDesktopNote rather than searching again, plus a prospectId/accountId when the attendee resolved to a CRM record (usable as listDesktopNotes filter[prospect][id]/filter[account][id]). Optionally scoped to a filter[startedAt][gte]/[lte] date range — omit q to just list notes in that range. Never returns another rep's notes. Also called "Nooks notes", "desktop notes", or plain "meeting notes" — these all refer to the same Nooks Desktop meeting notes.skipped.externalId, creating them if they don't already exist. Per-record outcomes are returned in results and errors.enabled flag. Setting enabled to false archives the sequence; true reactivates it. At least one field must be provided. OAuth callers with the user role can only update sequences they own (403 INSUFFICIENT_PERMISSION otherwise); admin and manager roles can update any sequence in the workspace.emailOverrides shape as POST /sequenceStates. Use this to refresh personalized content on an in-flight enrollment instead of removing and re-enrolling the prospect. The request body is the complete set of overrides for the enrollment, not a merge: - A step in emailOverrides that already has an unsent email (the current step, or a step overridden earlier) has its subject and body rewritten in place. A field you omit (subject or body) reverts to the step's template, not to the previous override; on a step with no template it keeps its current value. - A step in emailOverrides with no email yet gets a pending email that is used when the enrollment reaches it. - An email step you leave out of `emailOverrides` loses any override it had: a not-yet-reached step goes back to sending the step's template, and the current step's unsent draft is reverted to the template's content. This includes edits a user made to that draft in the Nooks Outbox. Only email steps can be overridden, and only the current step or later ones. Already-sent emails and AI-generated Play emails are never touched. The request is all-or-nothing: if any step is rejected, nothing is changed. Listing the enrollment's tasks (GET /tasks?filter[prospect][id]=…&filter[sequence][id]=…) shows which not-yet-reached email steps already have a pending task, but not why: a pending task can come from an override or from an AI-generated Play email (which this request never touches), and unsent draft content is not returned by GET /emails (see that endpoint). Treat this request as declaring the full desired set of overrides rather than reading the current one back first. Returns 409 if the enrollment is finished, or if the email for a step in emailOverrides has already been sent.dueAt reschedules the task to a new due date and time - ownerId reassigns the task to a different user - priority changes the task priority (low, normal, high, urgent) - note updates the task note (set to null to clear) At least one field must be provided. All other task fields (action, prospect, sequence, etc.) are immutable through this endpoint.Click any prompt to copy it.