{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["admonition"]},"type":"markdown"},"seo":{"title":"Common API patterns - Development Portal | Outreach","description":"Outreach extensibility development and documentation portal","siteUrl":"https://developers.outreach.io","keywords":"outreach developer portal, api documentation, api reference docs, sdk documentation","lang":"en-US","llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"common-patterns","__idx":0},"children":["Common patterns"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The Outreach API's flexibility helps support a wide range of possibilities and use cases. Our API works great as a"," ","light-weight CRM, as an entry-point into our platform's advanced automation capabilities, and as a tool to collect"," ","platform statistics. Continue reading for more specific use cases, and at the end of this section you'll find a"," ","reference to each resource that our API supports, including detailed information about that resource's attributes,"," ","relationships and available links."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"manage-prospects-and-accounts","__idx":1},"children":["Manage Prospects and Accounts"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Prospects — and the accounts they are associated with — are two of the core Outreach platform resources, and working"," ","with them is easy."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Let's say you've identified a new account that you want to target. You've found a few promising leads within that"," ","account and you'd like to add them to Outreach. Because you can't write to an account's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["prospects"]}," relationship, you'll"," ","want to first create the account resource. Then, with each new prospect that you add you can specify this new account"," ","within the prospect's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["account"]}," relationship."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"warning"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Note: In general, we're more likely to permit you to write to a \"to-one\""," ","relationship (such as the prospect's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["account"]},") than we are to a \"to-many\""," ","(such as the account's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["prospects"]},"). This choice is made for both technical"," ","and conceptual reasons, and it's something to lookout for. Consult the"," ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/api/reference/"},"children":["API Reference"]}," for details on"," ","specific resources."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To add a new account:"]},{"$$mdtype":"Tag","name":"p","attributes":{"className":"small"},"children":["Request"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"POST https://api.outreach.io/api/v2/accounts\n"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json5","header":{"controls":{"copy":{}}},"source":"{\n  data: {\n    type: \"account\",\n    attributes: {\n      name: \"Acme\",\n    },\n  },\n}\n","lang":"json5"},"children":[]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"warning"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Note: The requests in this section omit the necessary headers for brevity,"," ","namely ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Authorization"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Content-Type"]},"; they are"," ","necessary when performing actual requests. Additionally the JSON data for the"," ","request body is simply described below the request line; actual request must"," ","include this data as the request body."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If the request was successful, the newly created account resource will be returned:"]},{"$$mdtype":"Tag","name":"p","attributes":{"className":"small"},"children":["Response"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json5","header":{"controls":{"copy":{}}},"source":"{\n  data: {\n    type: \"account\",\n    id: 1,\n    attributes: {\n      createdAt: \"2017-01-01T00:00:00\",\n      name: \"Acme\",\n      updatedAt: \"2017-01-01T00:00:00\",\n      //...\n    },\n    relationships: {\n      prospects: {\n        links: {\n          related: \"https://api.outreach.io/api/v2/prospects?filter[account][id]=1\",\n        },\n      },\n      //...\n    },\n  },\n}\n","lang":"json5"},"children":[]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"warning"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Note that null attributes and relationships have been removed for brevity. By"," ","default resource objects include all attributes and relationships regardless"," ","of their value."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can see from this response that Outreach has added a bit more information than you provided. First, the"," ","fields ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["createdAt"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["updatedAt"]}," have been added with timestamps equal to when the request was made. Outreach"," ","maintains these timestamps internally for almost all resources; while they are visible, you cannot write to them."," ","Second, a relationships section has been added. The account resource exposes a single relationship, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["prospects"]},". Because"," ","accounts often contain many prospects, we only expose a related link and not a data list of resource identifiers. If you"," ","visit this URL you would receive an empty response, because we have not yet added any prospects to this account. Let's"," ","do that now!"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To add a new prospect to an account:"]},{"$$mdtype":"Tag","name":"p","attributes":{"className":"small"},"children":["Request"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"POST https://api.outreach.io/api/v2/prospects\n"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json5","header":{"controls":{"copy":{}}},"source":"{\n  data: {\n    type: \"prospect\",\n    attributes: {\n      emails: [\"sally.smith@acme.example.com\"],\n      firstName: \"Sally\",\n      title: \"CEO\",\n    },\n    relationships: {\n      account: {\n        data: {\n          type: \"account\",\n          id: 1,\n        },\n      },\n    },\n  },\n}\n","lang":"json5"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{"className":"small"},"children":["Response"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json5","header":{"controls":{"copy":{}}},"source":"{\n  data: {\n    type: \"prospect\",\n    id: 1,\n    attributes: {\n      createdAt: \"2017-01-01T00:00:00\",\n      emails: [\"sally.smith@acme.example.com\"],\n      firstName: \"Sally\",\n      lastName: \"Smith\",\n      title: \"CEO\",\n      updatedAt: \"2017-01-01T00:00:00\",\n      //...\n    },\n    relationships: {\n      account: {\n        data: {\n          type: \"account\",\n          id: 1,\n        },\n      },\n      //...\n    },\n  },\n}\n","lang":"json5"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To update an existing prospect:"]},{"$$mdtype":"Tag","name":"p","attributes":{"className":"small"},"children":["Request"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"PATCH https://api.outreach.io/api/v2/prospects/1\n"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json5","header":{"controls":{"copy":{}}},"source":"{\n  data: {\n    type: \"prospect\",\n    id: 1,\n    attributes: {\n      lastName: \"Smith\",\n    },\n    relationships: {\n      owner: {\n        data: {\n          type: \"user\",\n          id: 1,\n        },\n      },\n    },\n  },\n}\n","lang":"json5"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{"className":"small"},"children":["Response"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json5","header":{"controls":{"copy":{}}},"source":"{\n  data: {\n    type: \"prospect\",\n    id: 1,\n    attributes: {\n      createdAt: \"2017-01-01T00:00:00\",\n      emails: [\"sally.smith@acme.example.com\"],\n      firstName: \"Sally\",\n      lastName: \"Smith\",\n      title: \"CEO\",\n      updatedAt: \"2017-01-01T01:00:00\",\n      //...\n    },\n    relationships: {\n      account: {\n        data: {\n          type: \"account\",\n          id: 1,\n        },\n      },\n      owner: {\n        data: {\n          type: \"user\",\n          id: 1,\n        },\n      },\n      //...\n    },\n  },\n}\n","lang":"json5"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The request only included one changed attribute and one new relationship, but the response included all of the"," ","prospect's attributes and relationships. Remember that the Outreach API will only change the fields you provide."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For more information, see the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/api/reference/account"},"children":["Account"]}," and ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/api/reference/prospect"},"children":["Prospect"]}," API"," ","Reference pages."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"setup-and-manage-sequences","__idx":2},"children":["Setup and Manage Sequences"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Sequences are at the heart of Outreach's system of engagement. The Outreach API provides the ability to create and"," ","manage sequences and their related rulesets and sequence steps."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To create a new sequence, provide a short name and description, and specify a sequence type of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"interval\""]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"date\""]},":"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"POST https://api.outreach.io/api/v2/sequences\n"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json5","header":{"controls":{"copy":{}}},"source":"{\n  data: {\n    type: \"sequence\",\n    attributes: {\n      description: \"Primary Sales Sequence\",\n      name: \"Primary\",\n      sequenceType: \"interval\",\n    },\n  },\n}\n","lang":"json5"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["We picked ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"interval\""]}," to indicate that this sequence's steps are separated by an interval of days. Alternatively, we"," ","could have picked ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"date\""]}," to indicate that each step should advance at a specific date and time in the future."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Once you have the ID from the response of the create request, you can add the first sequence step. For this step we'll"," ","need to provide its step type and a time interval (in minutes), along with the sequence details:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"POST https://api.outreach.io/api/v2/sequenceSteps\n"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json5","header":{"controls":{"copy":{}}},"source":"{\n  data: {\n    type: \"sequenceStep\",\n    attributes: {\n      interval: 120,\n      stepType: \"call\",\n    },\n    relationships: {\n      sequence: {\n        data: {\n          type: \"sequence\",\n          id: 1,\n        },\n      },\n    },\n  },\n}\n","lang":"json5"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Accepted values for the step type attribute include ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"auto_email\""]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"call\""]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"manual_email\""]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"task\""]},". And if this"," ","step's sequence has a sequence type set to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"date\""]},", then we must instead provide a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"date\""]}," attribute rather than"," ","an ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"interval\""]}," attribute."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can also associate custom rulesets with sequences. First, create a new ruleset with a name and some settings:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"POST https://api.outreach.io/api/v2/rulesets\n"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json5","header":{"controls":{"copy":{}}},"source":"{\n  data: {\n    type: \"ruleset\",\n    id: 1,\n    attributes: {\n      autoResumeOotoProspects: true,\n      name: \"Custom Ruleset\",\n      permitDuplicateProspects: \"onlyIfActive\",\n    },\n  },\n}\n","lang":"json5"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Then associate the ruleset with the existing sequence:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"PATCH https://api.outreach.io/api/v2/sequences/1\n"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json5","header":{"controls":{"copy":{}}},"source":"{\n  data: {\n    type: \"sequence\",\n    id: 1,\n    relationships: {\n      ruleset: {\n        data: {\n          type: \"ruleset\",\n          id: 1,\n        },\n      },\n    },\n  },\n}\n","lang":"json5"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For more information, see the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/api/reference/sequence"},"children":["Sequence"]},", ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/api/reference/ruleset"},"children":["Ruleset"]}," ","and ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/api/reference/sequence-step"},"children":["Sequence Step"]}," API"," ","Reference pages."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"save-snippets-and-templates","__idx":3},"children":["Save Snippets and Templates"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Snippets and templates are valuable resources that save your team time and energy. Snippets provide easy access to your"," ","most commonly used HTML passages. Templates are larger resources that encapsulate a mailing's subject and body and can"," ","be associated with automated mailing sequence steps and one-off tasks. Templates can also contain a default list of"," ","recipients relevant to that topic."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To create a snippet, just provide the resource a name and the body's HTML representation:"]},{"$$mdtype":"Tag","name":"p","attributes":{"className":"small"},"children":["Request"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"POST https://api.outreach.io/api/v2/snippets\n"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json5","header":{"controls":{"copy":{}}},"source":"{\n  data: {\n    type: \"snippet\",\n    attributes: {\n      bodyHtml: \"<p>Would you please include in your response ...</p>\",\n      name: \"Request for Information\",\n    },\n  },\n}\n","lang":"json5"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{"className":"small"},"children":["Response"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json5","header":{"controls":{"copy":{}}},"source":"{\n  data: {\n    type: \"snippet\",\n    id: 1,\n    attributes: {\n      bodyHtml: \"<p>Would you please include in your response ...</p>\",\n      name: \"Request for Information\",\n    },\n    relationships: {\n      owner: {\n        data: {\n          type: \"user\",\n          id: 1,\n        },\n      },\n    },\n  },\n}\n","lang":"json5"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Templates are created in a similar fashion, but also contain relationship links to their related mailings, sequence"," ","templates and tasks. An example template may look like:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json5","header":{"controls":{"copy":{}}},"source":"{\n  data: {\n    type: \"template\",\n    id: 1,\n    attributes: {\n      bodyHtml: \"<p>I'd like to introduce you to our new product...\",\n      ccRecipients: [\"product@company.example.com\"],\n      name: \"Product Announcement\",\n    },\n    relationships: {\n      mailings: {\n        links: {\n          related: \"https://api.outreach.io/api/v2/mailings?filter[template][id]=1\",\n        },\n      },\n      owner: {\n        data: {\n          type: \"user\",\n          id: 1,\n        },\n      },\n      sequenceTemplates: {\n        links: {\n          related: \"https://api.outreach.io/api/v2/sequenceTemplates?filter[template][id]=1\",\n        },\n      },\n      tasks: {\n        links: {\n          related: \"https://api.outreach.io/api/v2/tasks?filter[template][id]=1\",\n        },\n      },\n    },\n  },\n}\n","lang":"json5"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Templates can be associated with mailings, sequence templates and tasks when creating or updating those resources. For"," ","example, we could associate this template with a brand new sequence template set to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"auto_email\""]}," mode that will send"," ","two days after the previous step:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"POST https://api.outreach.io/api/v2/sequenceSteps\n"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json5","header":{"controls":{"copy":{}}},"source":"{\n  data: {\n    type: \"sequenceStep\",\n    attributes: {\n      interval: 2880,\n      stepType: \"auto_email\",\n    },\n    relationships: {\n      sequence: {\n        data: {\n          type: \"sequence\",\n          id: 1,\n        },\n      },\n    },\n  },\n}\n","lang":"json5"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Assuming this returns an id of 1 for our sequenceStep"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"POST https://api.outreach.io/api/v2/sequenceTemplates\n"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json5","header":{"controls":{"copy":{}}},"source":"{\n  data: {\n    type: \"sequenceTemplate\",\n    relationships: {\n      sequenceStep: {\n        data: {\n          type: \"sequenceStep\",\n          id: 1,\n        },\n      },\n      template: {\n        data: {\n          type: \"template\",\n          id: 1,\n        },\n      },\n    },\n  },\n}\n","lang":"json5"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can also create unnamed templates that will be unavailable in a list of templates in the UI or from the API index"," ","action, but can still be associated with a sequence template in order to help prevent accidental editing of a template"," ","used for sequences."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"POST https://api.outreach.io/api/v2/templates\n"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json5","header":{"controls":{"copy":{}}},"source":"{\n  data: {\n    type: \"template\",\n    attributes: {\n      bodyHtml: \"<h1>Greetings!</h1>\",\n      subject: \"Hello prospect\",\n    },\n  },\n}\n","lang":"json5"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In order to remove the association of a sequence template to a sequence step, you must destroy the sequence template"," ","object."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For more information, see the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/api/reference/snippet"},"children":["Snippet"]}," and ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/api/reference/template"},"children":["Template"]}," API"," ","Reference pages."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"add-prospects-to-sequences","__idx":4},"children":["Add Prospects to Sequences"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Prospects can be added and removed from sequences at any time. The Outreach API encapsulates the concept of a prospect"," ","within a sequence as a ",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["sequence state"]}," resource. To start engaging a prospect, create a sequence state resource"," ","referencing the relevant prospect, sequence and user's mailbox:"]},{"$$mdtype":"Tag","name":"p","attributes":{"className":"small"},"children":["Request"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"POST https://api.outreach.io/api/v2/sequenceStates\n"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json5","header":{"controls":{"copy":{}}},"source":"{\n  data: {\n    type: \"sequenceState\",\n    relationships: {\n      prospect: {\n        data: {\n          type: \"prospect\",\n          id: 1,\n        },\n      },\n      sequence: {\n        data: {\n          type: \"sequence\",\n          id: 1,\n        },\n      },\n      mailbox: {\n        data: {\n          type: \"mailbox\",\n          id: 1,\n        },\n      },\n    },\n  },\n}\n","lang":"json5"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{"className":"small"},"children":["Response"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json5","header":{"controls":{"copy":{}}},"source":"{\n  data: {\n    type: \"sequenceState\",\n    id: 1,\n    attributes: {\n      createdAt: \"2017-01-01T00:00:00\",\n      state: \"active\",\n      stateChangedAt: \"2017-01-01T00:00:00\",\n      updatedAt: \"2017-01-01T00:00:00\",\n      //...\n    },\n    relationships: {\n      prospect: {\n        data: {\n          type: \"prospect\",\n          id: 1,\n        },\n      },\n      sequence: {\n        data: {\n          type: \"sequence\",\n          id: 1,\n        },\n      },\n      sequenceStep: {\n        data: {\n          type: \"sequenceStep\",\n          id: 1,\n        },\n      },\n      mailbox: {\n        data: {\n          type: \"mailbox\",\n          id: 1,\n        },\n      },\n    },\n  },\n}\n","lang":"json5"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Once created, the associated sequence's automation will begin. You can see that the first sequence step has already been"," ","associated with this sequence state. In addition, its ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["state"]}," attribute has been set to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"active\""]},"; additional values"," ","include ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"pending\""]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"finished\""]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"paused\""]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"disabled\""]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"failed\""]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"bounced\""]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"opted_out\""]},". Retrieve"," ","sequence states at later times to discover changes to its state and step."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To finish a prospect in a sequence, make a request to the sequence state's finish action:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"POST https://api.outreach.io/api/v2/sequenceStates/1/actions/finish\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can also ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pause"]}," active sequence states as well as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["resume"]}," those that have been paused."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For more information, see the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/api/reference/sequence-state"},"children":["Sequence State"]}," API Reference pages."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"schedule-mailings-and-tasks","__idx":5},"children":["Schedule Mailings and Tasks"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In addition to sequence-based automation, Outreach provides the ability to schedule one-off mailings and tasks."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"em","attributes":{},"children":["More information coming soon"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"discover-open-tasks","__idx":6},"children":["Discover Open Tasks"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Outreach can automatically assign users tasks when certain events occur to help streamline their workflow. The Outreach"," ","API can help identify new tasks and provide the opportunity to take the necessary action. To return just the tasks that"," ","a user can currently take action on, you can filter the task list by those with an ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"incomplete\""]}," state belonging to a"," ","given user. And to make the action step easier, you can include the task's related prospect:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"GET https://api.outreach.io/api/v2/tasks?filter[state]=incomplete&filter[owner][id]=1&include=prospect\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Task resources contain an ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["action"]}," attribute that describes what type of action the user needs to take, which can be one"," ","of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"action_item\""]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"call\""]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"email\""]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"in_person\""]},". Along with the task note and its related prospect, you're"," ","ready to take action!"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For more information, see the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/api/reference/task"},"children":["Task"]}," API Reference page."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"log-external-calls","__idx":7},"children":["Log External Calls"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Logging calls in Outreach is easy. In addition to the calling user and prospect, you'll just need to specify a call"," ","direction and outcome. The direction must be either ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"inbound\""]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"outbound\""]}," and the outcome must be"," ","either ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"completed\""]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"no_answer\""]},". You'll likely also want to provide the time when the call was answered and"," ","completed."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"POST https://api.outreach.io/api/v2/calls\n"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json5","header":{"controls":{"copy":{}}},"source":"{\n  data: {\n    type: \"call\",\n    attributes: {\n      answeredAt: \"2017-01-01T12:00:15\",\n      completedAt: \"2017-01-01T12:00:00\",\n      direction: \"outbound\",\n      outcome: \"completed\",\n    },\n    relationships: {\n      prospect: {\n        data: {\n          type: \"prospect\",\n          id: 1,\n        },\n      },\n      user: {\n        data: {\n          type: \"user\",\n          id: 1,\n        },\n      },\n    },\n  },\n}\n","lang":"json5"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If there's an existing open call task, then you may specify that task relationship when logging the call. The created"," ","call will be associated with the task, but the task itself will not be affected."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"POST https://api.outreach.io/api/v2/calls\n"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json5","header":{"controls":{"copy":{}}},"source":"{\n  data: {\n    type: \"call\",\n    attributes: {\n      direction: \"outbound\",\n      outcome: \"no_answer\",\n    },\n    relationships: {\n      prospect: {\n        data: {\n          type: \"prospect\",\n          id: 1,\n        },\n      },\n      task: {\n        data: {\n          type: \"task\",\n          id: 1,\n        },\n      },\n      user: {\n        data: {\n          type: \"user\",\n          id: 1,\n        },\n      },\n    },\n  },\n}\n","lang":"json5"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To additionally indicate that the related task has been completed, pass meta information to the task relationship"," ","itself."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"POST https://api.outreach.io/api/v2/calls\n"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json5","header":{"controls":{"copy":{}}},"source":"{\n  data: {\n    type: \"call\",\n    attributes: {\n      direction: \"outbound\",\n      note: \"Meeting Booked!\",\n      outcome: \"completed\",\n    },\n    relationships: {\n      prospect: {\n        data: {\n          type: \"prospect\",\n          id: 1,\n        },\n      },\n      task: {\n        data: {\n          type: \"task\",\n          id: 1,\n        },\n        meta: {\n          complete: true,\n        },\n      },\n      user: {\n        data: {\n          type: \"user\",\n          id: 1,\n        },\n      },\n    },\n  },\n}\n","lang":"json5"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For more information, see the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/api/reference/call"},"children":["Call"]}," API Reference page, along with the"," ","related ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/api/reference/call-disposition"},"children":["Call Disposition"]}," and ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/api/reference/call-purpose"},"children":["Call Purpose"]}," ","reference pages."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"download-event-activity","__idx":8},"children":["Download Event Activity"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Outreach logs numerous events when various activities occur throughout the platform. Collecting these events helps"," ","provide insight into a user and their organization's activity."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To download the most recent events, sort in a descending order based on the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["updatedAt"]}," timestamp:"]},{"$$mdtype":"Tag","name":"p","attributes":{"className":"small"},"children":["Request"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"GET https://api.outreach.io/api/v2/events?sort=-updatedAt\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{"className":"small"},"children":["Response"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json5","header":{"controls":{"copy":{}}},"source":"{\n  data: [\n    {\n      type: \"event\",\n      id: 1,\n      attributes: {\n        createdAt: \"2017-01-01T00:00:00\",\n        name: \"prospect_updated\",\n        updatedAt: \"2017-01-01T00:00:00\",\n        //...\n      },\n    },\n    //...\n  ],\n}\n","lang":"json5"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"em","attributes":{},"children":["More information on event payloads and relationships coming soon."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"collect-platform-statistics","__idx":9},"children":["Collect Platform Statistics"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Until the Outreach API supports better analytics resources, you can still collect statistics directly from the core"," ","resources. A number of mailing-related resources provide delivery information, including mailings, prospects, sequences,"," ","sequence states, sequence steps and templates."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For example, to retrieve mailing delivery statistics for prospects, specify sparse fieldsets to get just the attributes"," ","that you are looking for:"]},{"$$mdtype":"Tag","name":"p","attributes":{"className":"small"},"children":["Request"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"GET https://api.outreach.io/api/v2/prospects?fields[prospect]=clickCount,openCount,replyCount\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{"className":"small"},"children":["Response"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json5","header":{"controls":{"copy":{}}},"source":"{\n  data: [\n    {\n      type: \"prospect\",\n      id: 1,\n      attributes: {\n        clickCount: 2,\n        openCount: 9,\n        replyCount: 1,\n      },\n    },\n    //...\n  ],\n}\n","lang":"json5"},"children":[]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"warning"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Note that these counts reference the total number of events across all of the"," ","prospect's mailings since the last touch point. These counts are not the"," ","unique number of associated mailings that have received those events."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Continue reading the API Reference for detailed descriptions of all available attributes."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"respond-to-platform-events","__idx":10},"children":["Respond to Platform Events"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The Outreach API normally requires ",{"$$mdtype":"Tag","name":"em","attributes":{},"children":["your"]}," action to retrieve, create or update resources. But with webhooks, the"," ","Outreach API will automatically notify you whenever events that you are interested in occur. See the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/api/webhooks"},"children":["dedicated chapter"]}," for more details."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"invite-new-users","__idx":11},"children":["Invite New Users"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You can invite new users to the Outreach platform and manage their identities using the Outreach API. Create new users"," ","just like any other resource:"]},{"$$mdtype":"Tag","name":"p","attributes":{"className":"small"},"children":["Webhook Request"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"POST https://api.outreach.io/api/v2/users\n"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json5","header":{"controls":{"copy":{}}},"source":"{\n  data: {\n    type: \"user\",\n    attributes: {\n      email: \"foo@bar.com\",\n      firstName: \"Foo\",\n      lastName: \"Bar\",\n    },\n  },\n}\n","lang":"json5"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{"className":"small"},"children":["Response"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json5","header":{"controls":{"copy":{}}},"source":"{\n  data: {\n    type: \"user\",\n    id: 1,\n    attributes: {\n      email: \"foo@bar.com\",\n      firstName: \"Foo\",\n      lastName: \"Bar\",\n    },\n  },\n}\n","lang":"json5"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["By default all new users will receive an email invitation with instructions on how to get started. You can prevent email"," ","invitations from being sent by including an additional meta data parameter:"]},{"$$mdtype":"Tag","name":"p","attributes":{"className":"small"},"children":["Request"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"POST https://api.outreach.io/api/v2/users\n"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json5","header":{"controls":{"copy":{}}},"source":"{\n  data: {\n    type: \"user\",\n    attributes: {\n      email: \"foo@bar.com\",\n      firstName: \"Foo\",\n      lastName: \"Bar\",\n    },\n    meta: {\n      sendInvite: false,\n    },\n  },\n}\n","lang":"json5"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"create-compliance-requests","__idx":12},"children":["Create Compliance Requests"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Outreach provides a compliance request API for processing delete requests in compliance with regulations such as CCPA"," ","and GDPR. This request will be processed asynchronously, deletion may not be processed immediately."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To submit a request to permanently delete a prospect or individual in Outreach, include the following attributes to a"," ","POST request:"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Attribute"},"children":["Attribute"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["requester_email"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["* Email of the Outreach user making the request"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["request_type"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["* Set this value to 'Delete'"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["object_type"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["* Set this value to 'Prospect'"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["request_object_email"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["* Email of the Prospect to delete"]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{"className":"small"},"children":["Request"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"POST https://api.outreach.io/api/v2/complianceRequests\n"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json5","header":{"controls":{"copy":{}}},"source":"{\n  data: {\n    type: \"complianceRequest\",\n    attributes: {\n      requester_email: \"admin@example.com\",\n      request_type: \"Delete\",\n      object_type: \"Prospect\",\n      request_object_email: \"prospect_email@example.com\",\n    },\n  },\n}\n","lang":"json5"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{"className":"small"},"children":["Response"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json5","header":{"controls":{"copy":{}}},"source":"{\n  data: {\n    batch_compliance_request_id: \"f98711fe-8a03-48b9-91d3-0f7994e999cc\",\n  },\n}\n","lang":"json5"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Submitting a compliance request will trigger a batch of tasks to be processed. To view the status of the submitted"," ","request, use the batch compliance request filter on the following GET request."]},{"$$mdtype":"Tag","name":"p","attributes":{"className":"small"},"children":["Request"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"GET https://api.outreach.io/api/v2/complianceRequests?filter[batchComplianceRequest]=f98711fe-8a03-48b9-91d3-0f7994e999cc\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A compliance request may have any of the following states to indicate its current processing status:"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"State"},"children":["State"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["pending"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["* The request has been received but has not started processing"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["running"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["* The request is currently being processed"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["done"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["* The request has successfully been processed and is complete"]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A compliance request consists of multiple tasks targeting different elements of the request. Each task may also have its"," ","own state, shown below:"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"State"},"children":["State"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["pending"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["* The task has been created but has not started processing"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["queued"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["* The task has been queued for processing"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["running"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["* The task is currently being processed"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["done"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["* The task has successfully been processed and is complete"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["temporary_failure"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["* There was an issue with the task, it is in a temporary failed state and will be retried"]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The only permanent state for a task or request is the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["done"]}," state, any failures will be retried until successful."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For more information on compliance requests, contact Outreach support at support@outreach.io."]}]},"headings":[{"value":"Common patterns","id":"common-patterns","depth":1},{"value":"Manage Prospects and Accounts","id":"manage-prospects-and-accounts","depth":2},{"value":"Setup and Manage Sequences","id":"setup-and-manage-sequences","depth":2},{"value":"Save Snippets and Templates","id":"save-snippets-and-templates","depth":2},{"value":"Add Prospects to Sequences","id":"add-prospects-to-sequences","depth":2},{"value":"Schedule Mailings and Tasks","id":"schedule-mailings-and-tasks","depth":2},{"value":"Discover Open Tasks","id":"discover-open-tasks","depth":2},{"value":"Log External Calls","id":"log-external-calls","depth":2},{"value":"Download Event Activity","id":"download-event-activity","depth":2},{"value":"Collect Platform Statistics","id":"collect-platform-statistics","depth":2},{"value":"Respond to Platform Events","id":"respond-to-platform-events","depth":2},{"value":"Invite New Users","id":"invite-new-users","depth":2},{"value":"Create Compliance Requests","id":"create-compliance-requests","depth":2}],"frontmatter":{"seo":{"title":"Common API patterns - Development Portal | Outreach"}},"lastModified":"2026-04-29T11:57:31.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/api/common-patterns","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}