> ## Documentation Index
> Fetch the complete documentation index at: https://docs.attio.com/llms.txt
> Use this file to discover all available pages before exploring further.

# REST API

export const ChangelogSubscribe = () => {
  const RECAPTCHA_SITEKEY = "6LclumYsAAAAAEDZPKR5FkJS_zFx9hCaLy2Lbw0C";
  const [status, setStatus] = useState("idle");
  const [isPending, setIsPending] = useState(false);
  const [isEnabled, setIsEnabled] = useState(false);
  useEffect(() => {
    const enabled = new URLSearchParams(window.location.search).has("ff_changelog");
    setIsEnabled(enabled);
    if (enabled && !document.querySelector("script[data-recaptcha]")) {
      const script = document.createElement("script");
      script.src = `https://www.google.com/recaptcha/api.js?render=${RECAPTCHA_SITEKEY}`;
      script.dataset.recaptcha = "";
      document.head.appendChild(script);
    }
  }, []);
  const subscribe = async event => {
    event.preventDefault();
    setIsPending(true);
    const email = new FormData(event.currentTarget).get("email");
    try {
      await new Promise(resolve => window.grecaptcha.ready(resolve));
      const token = await window.grecaptcha.execute(RECAPTCHA_SITEKEY, {
        action: "email_cta"
      });
      const response = await fetch("https://attio.com/api/forms/email-cta", {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
          "X-Captcha-Token": token
        },
        body: JSON.stringify({
          email,
          customerEvent: "changelog_subscribed",
          type: "developer"
        })
      });
      const result = await response.json();
      setStatus(result.status === "success" ? "success" : "error");
    } catch {
      setStatus("error");
    } finally {
      setIsPending(false);
    }
  };
  if (!isEnabled) return null;
  return <div className="not-prose flex flex-col items-center text-center my-12">
      <h2 className="text-5xl font-semibold tracking-tight text-gray-900 dark:text-gray-100">
        What’s new
      </h2>
      <p className="mt-4 text-lg text-gray-700 dark:text-gray-300">
        Get updates on Attio’s developer tools in your inbox.
      </p>
      {status === "success" ? <p className="mt-6 text-gray-700 dark:text-gray-300">
          Thanks, you're subscribed to changelog updates.
        </p> : <form onSubmit={subscribe} className="mt-6 flex flex-wrap gap-3 items-start justify-center w-full">
          <label htmlFor="changelog-email" className="sr-only">
            Email
          </label>
          <div className="w-full max-w-sm">
            <input id="changelog-email" name="email" type="email" required maxLength={256} placeholder="Your email address" className="w-full rounded-xl border border-gray-300 dark:border-white/15 bg-white dark:bg-white/5 px-4 py-2.5 text-base text-gray-900 dark:text-gray-100 placeholder:text-gray-500 dark:placeholder:text-gray-400 focus:outline-none focus:border-gray-900 dark:focus:border-white" />
            {status === "error" && <p role="alert" className="mt-2 px-4 text-sm text-red-600 dark:text-red-400" style={{
    textAlign: "start"
  }}>
                Couldn't subscribe. Use a valid email and try again.
              </p>}
          </div>
          <button type="submit" disabled={isPending} aria-busy={isPending} className="w-36 rounded-xl bg-gray-900 dark:bg-white px-5 py-2.5 text-base font-medium text-white dark:text-gray-900 hover:bg-gray-700 dark:hover:bg-gray-200 disabled:opacity-50 disabled:cursor-not-allowed">
            {isPending ? "Subscribing…" : "Subscribe"}
          </button>
        </form>}
    </div>;
};

<ChangelogSubscribe />

<Update label="2026-09-21">
  ### Added

  * [Update a meeting (append linked records)](https://docs.attio.com/rest-api/endpoint-reference/meetings/update-a-meeting-append-linked-records)
    and
    [update a meeting (overwrite linked records)](https://docs.attio.com/rest-api/endpoint-reference/meetings/update-a-meeting-overwrite-linked-records)
    link records to a meeting. Appending adds to the meeting's existing linked records; overwriting
    replaces them, unlinking any record not included in the request. Both endpoints are in beta.
</Update>

<Update label="2026-09-17">
  ### Added

  * [Delete a meeting](https://docs.attio.com/rest-api/endpoint-reference/meetings/delete-a-meeting)
    deletes a single meeting. Meetings created by calendar sync cannot be deleted through the API;
    delete the event in the source calendar instead. This endpoint is in beta.
</Update>

<Update label="2026-09-11">
  ### Added

  * [Revoke](https://docs.attio.com/docs/oauth/revoke) revokes an access token, so that it can no
    longer be used to make requests to the Attio REST API.
</Update>

<Update label="2026-09-04">
  ### Added

  * [Delete an object](https://docs.attio.com/rest-api/endpoint-reference/objects/delete-an-object)
    deletes a custom object and all of its records. System objects, such as people and companies,
    cannot be deleted.

  <Warning>
    This endpoint is destructive and cannot be undone. Use it with caution, as it has the potential
    to remove a large amount of valuable data.
  </Warning>
</Update>

<Update label="2026-09-02">
  ### Changed

  * [List notes](https://docs.attio.com/rest-api/endpoint-reference/notes/list-notes) is now rate
    limited to 10 requests per second, down from the default 100 requests per second for reads. This
    is a temporary measure to protect platform stability, and we will announce here when the limit is
    raised again.
</Update>

<Update label="2026-09-01">
  ### Changed

  * [List threads](https://docs.attio.com/rest-api/endpoint-reference/threads/list-threads) now returns
    at most 80 replies per thread, oldest first. Each thread gets a new `has_more_comments` field to
    indicate if there are more comments to fetch.
  * [Get a thread and its comments](https://docs.attio.com/rest-api/endpoint-reference/threads/get-a-thread-and-its-comments)
    (formerly "Get a thread") is now paginated: at most 250 comments are returned per request. Use the
    new `cursor` and `limit` query parameters to page through a thread's comments, and `created_after` to
    return only comments created after a timestamp, useful for polling a thread for new replies. The
    response now includes a `pagination.next_cursor` field.
</Update>

<Update label="2026-08-25">
  ### Added

  * [Update a note](https://docs.attio.com/rest-api/endpoint-reference/notes/update-a-note) changes
    an existing note's title and/or content. Only the fields you provide are changed; a note's parent
    record cannot be changed.
</Update>

<Update label="2026-08-21">
  ### Added

  * [Add emails to the unsubscribe list](https://docs.attio.com/rest-api/endpoint-reference/sequences/add-emails-to-the-unsubscribe-list) allows you to add email addresses to the global sequences unsubscribe list. This endpoint is in beta.
</Update>

<Update label="2026-08-17">
  ### Added

  * [Write record attribute values](https://docs.attio.com/rest-api/endpoint-reference/records/write-record-attribute-values)
    and
    [write list entry attribute values](https://docs.attio.com/rest-api/endpoint-reference/entries/write-list-entry-attribute-values)
    replace the full value history of one attribute, for migration of historical data from other
    systems. Webhooks and workflow triggers do not fire for these writes. Both endpoints are in beta.
  * [Merge two records](https://docs.attio.com/rest-api/endpoint-reference/records/merge-two-records)
    combines two records of the same object into one new record. The values of the primary record have
    precedence. This endpoint is in beta.
  * [List emails](https://docs.attio.com/rest-api/endpoint-reference/emails/list-emails) gives the
    metadata of emails from the connected mailboxes in your workspace. Email content is never
    returned. This endpoint is in alpha.
</Update>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.