> ## Documentation Index
> Fetch the complete documentation index at: https://www.1password.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Service account rate limits

export const CodeWrapper = ({variant, children}) => {
  const variantStyles = {
    bad: "[&_.code-block-background]:!mint-bg-red-100 [&_.code-block-background]:dark:!mint-bg-red-950/50",
    good: "[&_.code-block-background]:!mint-bg-green-100 [&_.code-block-background]:dark:!mint-bg-green-950/50"
  };
  const appliedStyles = variant ? variantStyles[variant] : "";
  return <div className={`coloredCodeWrapper ${appliedStyles}`}>{children}</div>;
};

export const CodeResult = ({children, resultLang, wrap, expandable}) => {
  const parseChildren = () => {
    let language = "text";
    let codeContent = "";
    const extractText = node => {
      if (typeof node === "string") {
        return node;
      }
      if (Array.isArray(node)) {
        return node.map(extractText).join("");
      }
      if (node?.props?.children) {
        return extractText(node.props.children);
      }
      return "";
    };
    const extractLanguage = node => {
      if (!node) return null;
      if (node.props?.className) {
        const className = node.props.className;
        const langMatch = className.match(/language-(\w+)/);
        if (langMatch) {
          return langMatch[1];
        }
      }
      if (node.props?.["data-language"]) {
        return node.props["data-language"];
      }
      if (node.props?.language) {
        return node.props.language;
      }
      return null;
    };
    if (typeof children === "string") {
      codeContent = children;
    } else if (Array.isArray(children)) {
      codeContent = extractText(children);
      for (const child of children) {
        const detectedLang = extractLanguage(child);
        if (detectedLang) {
          language = detectedLang;
          break;
        }
      }
    } else if (children?.props) {
      const detectedLang = extractLanguage(children);
      if (detectedLang) {
        language = detectedLang;
      }
      codeContent = extractText(children);
    }
    const parts = codeContent.split("#code-result");
    if (parts.length < 2) {
      return {
        command: codeContent.trim(),
        result: null,
        language,
        defaultOpen: false
      };
    }
    const resultText = parts[1].trim();
    const defaultOpen = resultText.startsWith("open");
    const cleanResult = defaultOpen ? resultText.slice(4).trim() : resultText;
    return {
      command: parts[0].trim(),
      result: cleanResult,
      language,
      defaultOpen
    };
  };
  const {command, result, language, defaultOpen} = parseChildren();
  const [isOpen, setIsOpen] = useState(defaultOpen);
  if (!result) {
    return children;
  }
  return <div className="codeblock_accordion not-prose mb-4">
      {}
      <div className="[&>*]:!mb-0 [&>*]:!rounded-b-none">
        <CodeBlock language={language} children={command} wrap={wrap} expandable={expandable} />
      </div>

      {}
      <div className="see_results_container border-t-0 bg-gray-100/80 dark:bg-gray-800/80 overflow-hidden" style={{
    marginTop: "-0.25rem"
  }}>
        <button onClick={() => setIsOpen(!isOpen)} className="w-full px-4 py-2.5 flex items-center gap-1 text-left text-[14px] font-medium text-gray-600 dark:text-gray-400 hover:text-gray-800 dark:hover:text-gray-200 hover:bg-gray-200/60 dark:hover:bg-gray-700/60 transition-all duration-150" aria-expanded={isOpen}>
          {isOpen ? <Icon icon="caret-down" size="14" iconType="solid" /> : <Icon icon="caret-right" size="14" iconType="solid" />}

          <span>See result...</span>
        </button>

        {isOpen && <div className="[&>*]:!mt-0 [&>*]:!rounded-t-none border-t border-[var(--op-border-ui)] dark:border-[var(--op-border-ui-dark)]">
            <CodeBlock language={resultLang || language} children={result} wrap={wrap} expandable={expandable} />
          </div>}
      </div>
    </div>;
};

export const Small = ({children}) => {
  return <small>{children}</small>;
};

1Password Service Accounts have hourly limits and daily limits. [Hourly limits](#hourly-limits) control the number of read and write actions a service account can perform within a 60-minute window. [Daily limits](#daily-limits) determine the total number of requests that all service accounts within a 1Password account can make in a 24-hour window. Some 1Password CLI commands make more than one request.

You can use [`op service-account ratelimit`](/cli/reference/management-commands/service-account#service-account-ratelimit) to get rate limit usage data for the service account currently set with the `OP_SERVICE_ACCOUNT_TOKEN` environment variable.

To get information about a specific service account, specify a service account by its name or ID.

<CodeResult>
  ```bash theme={null}
  op service-account ratelimit <service-account>
  #code-result
  TYPE       ACTION        LIMIT    USED    REMAINING    RESET
  token      write         1000     0       1000         N/A
  token      read          10000    3       9997         59 minutes from now
  account    read_write    50000    3       49997        23 hours from now
  ```
</CodeResult>

<Tip>
  Learn which 1Password CLI commands [make multiple requests](/service-accounts/use-with-1password-cli#commands-that-make-multiple-requests).
</Tip>

## Hourly limits

Service account tokens have hourly limits applied to both read and write actions independently. The 60-minute time window begins after 1Password receives the first request.

Your 1Password account type determines the hourly limits.

| Account type                                                                                                                                               | Action | Limit  | Period | Scope                     |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | ------ | ------ | ------------------------- |
| [1Password Business](https://support.1password.com/explore/business/)                                                                                      | Read   | 10,000 | 1 hour | Per service account token |
|                                                                                                                                                            | Write  | 1,000  | 1 hour | Per service account token |
| 1Password, [1Password Families](https://support.1password.com/explore/families/), and [1Password Teams](https://support.1password.com/explore/team-admin/) | Read   | 1,000  | 1 hour | Per service account token |
|                                                                                                                                                            | Write  | 100    | 1 hour | Per service account token |

If you exceed the hourly limit, you'll receive the following error:

<CodeWrapper variant="bad">
  ```text theme={null}
  Error: [ERROR] (429) Too Many Requests: You've reached the maximum number of this type of requests this service account is allowed to make. Please retry in 59 minutes or try other requests.
  ```
</CodeWrapper>

<Tip>
  If you hit an hourly limit, you can:

  * Wait for the 60-minute window to reset.
  * [Change your 1Password account type.](https://support.1password.com/change-account-type/)
  * [Contact 1Password support.](https://support.1password.com/contact/)
  * [Create a new service account.](/service-accounts/get-started/) <br /><Small>Hourly limits are scoped per service account token.</Small>
</Tip>

## Daily limits

1Password has daily limits in place that determine the total number of requests that all service accounts can make over a 24-hour period.

Your 1Password account type determines the daily limit.

| Account type                                                                        | Action     | Limit  | Period   | Scope                 |
| ----------------------------------------------------------------------------------- | ---------- | ------ | -------- | --------------------- |
| [1Password Business](https://support.1password.com/explore/business/)               | Read/Write | 50,000 | 24 hours | Per 1Password account |
| [1Password Teams](https://support.1password.com/explore/team-admin/)                | Read/Write | 5,000  | 24 hours | Per 1Password account |
| 1Password and [1Password Families](https://support.1password.com/explore/families/) | Read/Write | 1,000  | 24 hours | Per 1Password account |

If you exceed the daily limit, you'll receive the following error:

<CodeWrapper variant="bad">
  ```text theme={null}
  Error: [ERROR] (429) Too Many Requests: You've reached the maximum number of this type of requests this 1Password account is allowed to make. Please retry in 23 hours and 59 minutes or try other requests.
  ```
</CodeWrapper>

<Tip>
  If you hit a daily limit, you can:

  * Wait for the 24-hour window to reset.
  * [Change your 1Password account type.](https://support.1password.com/change-account-type/)
  * [Contact 1Password support.](https://support.1password.com/contact/)
</Tip>
