From 0cb14852592dd18d28f963a31765951393bba134 Mon Sep 17 00:00:00 2001 From: EarningsCall Date: Sun, 18 Oct 2026 14:19:40 -0500 Subject: [PATCH 1/2] feat: move to api.earningscall.dev, pin schema v4, honor Retry-After Switch the API base from https://v2.api.earningscall.biz to https://api.earningscall.dev, overridable with EARNINGSCALL_API_BASE. The new API returns its newest response schema (v4) unless the request names one, and v4 changes shapes the client parses: - Transcript speakers are inlined as {"id", "name", "title"} instead of a speaker id plus speaker_name_map_v2. - Calendar results are wrapped as {"events": [...]} instead of a list. - 403 responses send X-Plan-Type but no longer X-Plan-Name, which made download_audio_file()/download_slide_deck() raise KeyError. Pin X-API-Version-Schema: v4 on every request (including the cached path, which previously sent no headers) so future server-side schema upgrades can't silently change responses. Map v4 speakers back onto Speaker.speaker / speaker_info / speaker_name_map_v2 and unwrap the calendar, so public results are unchanged; a test parses the v2 and v4 recordings of the same transcript and asserts they are identical. On 429 and 5xx, retries now wait for the Retry-After header (seconds or HTTP date) instead of the client's own backoff, falling back to retry_strategy when the header is missing. Also fix the invalid API key message, which was missing its f-string prefix and showed a literal {DOMAIN}. Bump version to 3.1.0. Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 10 + CLAUDE.md | 19 +- README.md | 4 +- earningscall/api.py | 39 +- earningscall/company.py | 17 +- earningscall/exports.py | 4 +- earningscall/transcript.py | 25 + pyproject.toml | 2 +- .../aapl-q1-2022-advanced-data-level-2.yaml | 2 +- .../aapl-q1-2022-advanced-data-level-3.yaml | 2 +- .../aapl-q1-2022-advanced-data-level-4.yaml | 2 +- .../aapl-q1-2022-speaker-name-map-v2.yaml | 2 +- .../data/aapl-q1-2023-level-2-schema-v4.yaml | 675 ++++++++++++++++++ .../data/aapl-q1-2023-level-3-schema-v4.yaml | 88 +++ .../data/aapl-q1-2030-not-authorized-l2.yaml | 2 +- tests/data/aapl-q1-2030-not-authorized.yaml | 2 +- tests/data/aapl-q1-2030-not-found.yaml | 2 +- tests/data/aapl-q1-2030-server-error.yaml | 2 +- tests/data/demo-symbols-v2-alpha.yaml | 2 +- tests/data/demo-symbols-v2.yaml | 2 +- tests/data/get-calendar-500-error.yaml | 2 +- .../data/get-calendar-not-found-response.yaml | 2 +- .../data/get-calendar-schema-v4-response.yaml | 46 ++ .../get-calendar-successful-response.yaml | 2 +- tests/data/meta-q3-2024-not-authorized.yaml | 2 +- tests/data/meta-q3-2024-not-found.yaml | 2 +- tests/data/meta-q3-2024-other-error.yaml | 2 +- .../meta-q3-2024-slides-not-authorized.yaml | 2 +- tests/data/meta-q3-2024-slides-not-found.yaml | 2 +- .../data/meta-q3-2024-slides-other-error.yaml | 2 +- tests/data/msft-company-events.yaml | 2 +- .../msft-q1-2022-audio-file-short-clip.yaml | 2 +- .../msft-q1-2022-slide-deck-short-clip.yaml | 2 +- tests/data/msft-transcript-response.yaml | 2 +- .../nvda-q2-2025-level-4-data-missing.yaml | 2 +- tests/data/sp500-company-list-failed.yaml | 2 +- tests/data/sp500-company-list.yaml | 2 +- tests/data/symbols-v2-missing-edge-cases.yaml | 2 +- tests/data/symbols-v2.yaml | 2 +- tests/test_api.py | 119 +++ tests/test_download_audio_files.py | 13 +- tests/test_download_slide_decks.py | 13 +- tests/test_get_calendar.py | 17 +- tests/test_get_company_events.py | 2 +- tests/test_get_sp500_companies_api.py | 18 +- tests/test_get_transcript.py | 120 +++- tests/test_symbols.py | 4 +- 47 files changed, 1219 insertions(+), 72 deletions(-) create mode 100644 tests/data/aapl-q1-2023-level-2-schema-v4.yaml create mode 100644 tests/data/aapl-q1-2023-level-3-schema-v4.yaml create mode 100644 tests/data/get-calendar-schema-v4-response.yaml diff --git a/CHANGELOG.md b/CHANGELOG.md index f783f1a..9cb009d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## Release `3.1.0` - 2026-10-18 + +* Switch to the new API endpoint, `https://api.earningscall.dev`. Override it with the `EARNINGSCALL_API_BASE` environment variable. +* Pin the API response schema to `v4` with the `X-API-Version-Schema` request header, so server-side schema upgrades can't change the responses this library parses. +* Schema v4 inlines speaker names and titles in transcripts. They are mapped onto the existing `Speaker.speaker`, `Speaker.speaker_info`, and `Transcript.speaker_name_map_v2` fields, so transcript results are unchanged. +* Schema v4 wraps calendar results as `{"events": [...]}`. `get_calendar()` handles both shapes. +* When the API is rate limited (HTTP 429) or unavailable (HTTP 5xx), retries now wait for the duration in the `Retry-After` header, falling back to the configured `retry_strategy` backoff when the header is missing. +* Bugfix: `download_audio_file()` and `download_slide_deck()` raised `KeyError` instead of `InsufficientApiAccessError` when a 403 response lacked the `X-Plan-Name` header. The plan name now falls back to `X-Plan-Type`. +* Bugfix: the invalid API key error message now includes the actual link instead of a literal `{DOMAIN}`. + ## Release `3.0.0` - 2026-10-18 * **Breaking**: Drop support for Python 3.10, which reached end-of-life in October 2026. Minimum required version is now Python 3.11. diff --git a/CLAUDE.md b/CLAUDE.md index 57037a8..4106763 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,11 +4,12 @@ The public Python client library for the EarningsCall developer API, published to PyPI as [`earningscall`](https://pypi.org/project/earningscall/). It is a -thin `requests`-based SDK: all calls hit `https://v2.api.earningscall.biz` (domain -overridable via `EARNINGSCALL_DOMAIN`), plus `https://earningscall.biz/exchanges.json` -for the exchange list. Auth is an `apikey` query param resolved from +thin `requests`-based SDK: all calls hit `https://api.earningscall.dev` +(overridable via `EARNINGSCALL_API_BASE`), plus `https://earningscall.biz/exchanges.json` +for the exchange list (website domain overridable via `EARNINGSCALL_DOMAIN`). +Auth is an `apikey` query param resolved from `earningscall.api_key`, then the `ECALL_API_KEY` / `EARNINGSCALL_API_KEY` env -vars, defaulting to `"demo"` (AAPL-only sample access; other symbols raise +vars, defaulting to `"demo"` (AAPL and MSFT sample access; other symbols raise `InsufficientApiAccessError`). Public surface (see `earningscall/__init__.py`): `get_company`, `get_all_companies`, `get_sp500_companies`, `get_calendar`, `Symbols`, `load_symbols`, `exchanges`, and module-level config @@ -18,8 +19,8 @@ vars, defaulting to `"demo"` (AAPL-only sample access; other symbols raise - `earningscall/api.py` — HTTP layer. Endpoint wrappers (`events`, `transcript`, `audio`, `slides`, `calendar`, `symbols-v2.txt`, - `symbols/sp500.txt`), retry with backoff on 429/5xx, 401 → - `InvalidApiKeyError`, optional `requests-cache` sqlite cache + `symbols/sp500.txt`), retry on 429/5xx (waits for `Retry-After`, else + backoff), 401 → `InvalidApiKeyError`, optional `requests-cache` sqlite cache (`.earningscall_cache` in the temp dir, on by default). - `earningscall/exports.py` — the top-level functions re-exported by `__init__.py`. @@ -58,3 +59,9 @@ vars, defaulting to `"demo"` (AAPL-only sample access; other symbols raise and the on-disk requests cache persist stale data across calls; use `clear_symbols()` / `api.purge_cache()` in tests (see the autouse fixture in `tests/test_helper.py`). +- The API serves its newest response schema unless the request names one, so + `api.py` pins `X-API-Version-Schema` (`API_SCHEMA_VERSION`). Schema v4 inlines + speakers as `{id, name, title}` and wraps calendar results in `{"events": [...]}`; + `normalize_transcript_payload()` and `get_calendar()` map these onto the + public models. Bumping the pinned version means re-checking every response + shape. Unknown versions silently fall back to v2. diff --git a/README.md b/README.md index 7f8eb77..8818561 100644 --- a/README.md +++ b/README.md @@ -303,7 +303,7 @@ earningscall.enable_requests_cache = False ### Retry Strategy -The library implements a flexible retry strategy to handle rate limiting and HTTP 5xx errors effectively. By default, it retries with increasing delays: 3 seconds, 6 seconds, 12 seconds, 24 seconds, and finally 48 seconds. If the request fails after five attempts, the library raises an exception. +The library retries requests that are rate limited (HTTP 429) or fail with an HTTP 5xx error. When the API says how long to wait, via the `Retry-After` header, the library waits exactly that long before retrying. Otherwise it backs off with increasing delays: by default 1 second, then 2, 4, 8, and so on, for up to 10 total attempts. If the request still fails, the library raises an exception. #### Customizing the Retry Strategy @@ -312,7 +312,7 @@ Depending on your specific requirements, you can adjust the retry strategy. For To customize the retry behavior, set the `retry_strategy` variable with the desired parameters: - **strategy**: "exponential" | "linear" — defines the type of retry strategy (default is "exponential"). -- **base_delay**: float (in seconds) — specifies the delay between retries (default is 1 seconds). +- **base_delay**: float (in seconds) — specifies the delay between retries when the API does not send a `Retry-After` header (default is 1 second). - **max_attempts**: int — sets the maximum number of total request attempts (default is 10). #### Default Retry Strategy diff --git a/earningscall/api.py b/earningscall/api.py index ea3cc91..273aba9 100644 --- a/earningscall/api.py +++ b/earningscall/api.py @@ -1,9 +1,11 @@ +import email.utils import importlib.metadata import logging import os import platform import time import urllib.parse +from datetime import datetime, timezone from typing import Dict, Optional, Union import requests @@ -15,7 +17,10 @@ log = logging.getLogger(__file__) DOMAIN = os.environ.get("EARNINGSCALL_DOMAIN", "earningscall.biz") -API_BASE = f"https://v2.api.{DOMAIN}" +API_BASE = os.environ.get("EARNINGSCALL_API_BASE", "https://api.earningscall.dev") +# The API serves its newest response schema unless a version is requested, so pin the +# schema this client parses to keep server-side schema upgrades from changing responses. +API_SCHEMA_VERSION = "v4" DEFAULT_RETRY_STRATEGY: Dict[str, Union[str, int, float]] = { "strategy": "exponential", "base_delay": 1, @@ -84,6 +89,7 @@ def get_headers() -> dict: return { "User-Agent": get_user_agent(), "X-EarningsCall-Version": earnings_call_version, + "X-API-Version-Schema": API_SCHEMA_VERSION, } @@ -107,6 +113,26 @@ def can_retry(response: requests.Response) -> bool: return False +def get_retry_after_seconds(response: requests.Response) -> Optional[float]: + """ + Parse the Retry-After header, which is either a number of seconds or an HTTP date. + + Returns None when the header is missing or malformed. + """ + retry_after = response.headers.get("Retry-After") + if not retry_after: + return None + try: + return max(float(retry_after), 0.0) + except ValueError: + pass + try: + retry_at = email.utils.parsedate_to_datetime(retry_after) + except (TypeError, ValueError): + return None + return max((retry_at - datetime.now(timezone.utc)).total_seconds(), 0.0) + + def is_success(response: requests.Response) -> bool: # TODO: Do we need to check for 2xx status codes? return response.status_code == 200 @@ -144,7 +170,7 @@ def do_get( response: requests.Response for attempt in range(max_attempts): if use_cache and earningscall.enable_requests_cache: - response = cache_session().get(url, params=params) + response = cache_session().get(url, params=params, headers=get_headers()) else: response = requests.get( url, @@ -157,7 +183,7 @@ def do_get( return response if response.status_code == 401: - raise InvalidApiKeyError("Your API key is invalid. You can get your API key at: https://{DOMAIN}/api-key") + raise InvalidApiKeyError(f"Your API key is invalid. You can get your API key at: https://{DOMAIN}/api-key") if not can_retry(response): return response @@ -169,9 +195,14 @@ def do_get( wait_time = delay * (attempt + 1) # Linear backoff: 1s -> 2s -> 3s -> 4s -> 5s -> 6s -> 7s else: raise ValueError("Invalid retry strategy. Must be one of: 'exponential', 'linear'") + # The server knows when the rate limit resets, so its Retry-After wins over our own backoff. + retry_after = get_retry_after_seconds(response) + if retry_after is not None: + wait_time = retry_after # TODO: Should we log a warning here? Does the customer want to see this log? log.warning( - f"Rate limited (429). Retrying in {wait_time} seconds... (Attempt {attempt + 1}/{max_attempts})" + f"Received HTTP {response.status_code}. Retrying in {wait_time} seconds... " + f"(Attempt {attempt + 1}/{max_attempts})" ) time.sleep(float(wait_time)) diff --git a/earningscall/company.py b/earningscall/company.py index 2f76b38..2c016b5 100644 --- a/earningscall/company.py +++ b/earningscall/company.py @@ -7,11 +7,18 @@ from earningscall.errors import InsufficientApiAccessError from earningscall.event import EarningsEvent from earningscall.symbols import CompanyInfo -from earningscall.transcript import Transcript +from earningscall.transcript import Transcript, normalize_transcript_payload log = logging.getLogger(__file__) +def _plan_name(response: Optional[requests.Response]) -> str: + if response is None: + return "unknown" + # The v2 API sent X-Plan-Name; api.earningscall.dev only sends X-Plan-Type. + return response.headers.get("X-Plan-Name") or response.headers.get("X-Plan-Type") or "unknown" + + class Company: """ A class representing a company. @@ -89,7 +96,7 @@ def get_transcript( ) # TODO: Investigate alternatives to @dataclass for level 3 transcripts, as this is # extremely slow. - transcript = Transcript.from_dict(response_payload) # type: ignore + transcript = Transcript.from_dict(normalize_transcript_payload(response_payload)) # type: ignore if level == 3: for speaker in transcript.speakers: speaker.text = " ".join(speaker.words) @@ -108,7 +115,7 @@ def get_transcript( if error.response.status_code == 404: return None if error.response.status_code == 403: - plan_name = error.response.headers.get("X-Plan-Name", "unknown") + plan_name = _plan_name(error.response) if 2 <= level <= 4: error_message = ( f"Your plan ({plan_name}) does not include Advanced Transcript Data. " @@ -159,7 +166,7 @@ def download_audio_file( if error.response.status_code == 404: return None if error.response.status_code == 403: - plan_name = error.response.headers["X-Plan-Name"] + plan_name = _plan_name(error.response) error_message = ( f"Your plan ({plan_name}) does not include Audio Files. " "Upgrade your plan here: https://earningscall.biz/api-pricing" @@ -207,7 +214,7 @@ def download_slide_deck( if error.response.status_code == 404: return None if error.response.status_code == 403: - plan_name = error.response.headers["X-Plan-Name"] + plan_name = _plan_name(error.response) error_message = ( f"Your plan ({plan_name}) does not include Slide Decks. " "Upgrade your plan here: https://earningscall.biz/api-pricing" diff --git a/earningscall/exports.py b/earningscall/exports.py index 8b7eeb8..fe24328 100644 --- a/earningscall/exports.py +++ b/earningscall/exports.py @@ -78,7 +78,9 @@ def get_calendar(input_date: date) -> List[CalendarEvent]: ) try: json_data = api.get_calendar_api_operation(input_date.year, input_date.month, input_date.day) - return [CalendarEvent.from_dict(event) for event in json_data] # type: ignore + # Schema v4 wraps the list as {"events": [...]}; earlier schemas return the bare list. + events = json_data["events"] if isinstance(json_data, dict) else json_data + return [CalendarEvent.from_dict(event) for event in events] # type: ignore except requests.exceptions.HTTPError as error: if error.response.status_code == 404: # Calendar Date not found, simply return an empty list diff --git a/earningscall/transcript.py b/earningscall/transcript.py index 84f45ce..85a4ebd 100644 --- a/earningscall/transcript.py +++ b/earningscall/transcript.py @@ -32,3 +32,28 @@ class Transcript: prepared_remarks: Optional[str] = field(default=None) questions_and_answers: Optional[str] = field(default=None) speaker_name_map_v2: Optional[Dict[str, SpeakerInfo]] = field(default=None) + + +def normalize_transcript_payload(payload: dict) -> dict: + """ + Convert schema v4 speakers to the shape the Transcript model exposes. + + Schema v4 inlines each speaker as {"id", "name", "title"}, while the model keeps the + speaker id in Speaker.speaker and names/titles in speaker_name_map_v2. Payloads that + are already in that shape are returned unchanged. + """ + speakers = payload.get("speakers") + if not speakers or not any(isinstance(speaker.get("speaker"), dict) for speaker in speakers): + return payload + speaker_name_map = dict(payload.get("speaker_name_map_v2") or {}) + normalized_speakers = [] + for speaker in speakers: + speaker_info = speaker.get("speaker") + if isinstance(speaker_info, dict): + speaker_id = speaker_info.get("id") + speaker_name_map.setdefault( + speaker_id, {"name": speaker_info.get("name"), "title": speaker_info.get("title")} + ) + speaker = {**speaker, "speaker": speaker_id} + normalized_speakers.append(speaker) + return {**payload, "speakers": normalized_speakers, "speaker_name_map_v2": speaker_name_map} diff --git a/pyproject.toml b/pyproject.toml index d146bfc..ac199bc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "earningscall" -version = "3.0.0" +version = "3.1.0" description = "The EarningsCall Python library provides convenient access to the EarningsCall API. It includes a pre-defined set of classes for API resources that initialize themselves dynamically from API responses." readme = "README.md" authors = [{ name = "EarningsCall", email = "dev@earningscall.biz" }] diff --git a/tests/data/aapl-q1-2022-advanced-data-level-2.yaml b/tests/data/aapl-q1-2022-advanced-data-level-2.yaml index 6c14349..5092f81 100644 --- a/tests/data/aapl-q1-2022-advanced-data-level-2.yaml +++ b/tests/data/aapl-q1-2022-advanced-data-level-2.yaml @@ -624,4 +624,4 @@ responses: x-amz-server-side-encryption: AES256 method: GET status: 200 - url: https://v2.api.earningscall.biz/transcript?apikey=demo&exchange=NASDAQ&symbol=AAPL&year=2022&quarter=1&level=2 + url: https://api.earningscall.dev/transcript?apikey=demo&exchange=NASDAQ&symbol=AAPL&year=2022&quarter=1&level=2 diff --git a/tests/data/aapl-q1-2022-advanced-data-level-3.yaml b/tests/data/aapl-q1-2022-advanced-data-level-3.yaml index e344523..6b0b72b 100644 --- a/tests/data/aapl-q1-2022-advanced-data-level-3.yaml +++ b/tests/data/aapl-q1-2022-advanced-data-level-3.yaml @@ -1866,4 +1866,4 @@ responses: x-amz-server-side-encryption: AES256 method: GET status: 200 - url: https://v2.api.earningscall.biz/transcript?apikey=demo&exchange=NASDAQ&symbol=AAPL&year=2022&quarter=1&level=3 + url: https://api.earningscall.dev/transcript?apikey=demo&exchange=NASDAQ&symbol=AAPL&year=2022&quarter=1&level=3 diff --git a/tests/data/aapl-q1-2022-advanced-data-level-4.yaml b/tests/data/aapl-q1-2022-advanced-data-level-4.yaml index c53af9a..4064471 100644 --- a/tests/data/aapl-q1-2022-advanced-data-level-4.yaml +++ b/tests/data/aapl-q1-2022-advanced-data-level-4.yaml @@ -592,4 +592,4 @@ responses: x-amz-server-side-encryption: AES256 method: GET status: 200 - url: https://v2.api.earningscall.biz/transcript?apikey=demo&exchange=NASDAQ&symbol=AAPL&year=2022&quarter=1&level=4 + url: https://api.earningscall.dev/transcript?apikey=demo&exchange=NASDAQ&symbol=AAPL&year=2022&quarter=1&level=4 diff --git a/tests/data/aapl-q1-2022-speaker-name-map-v2.yaml b/tests/data/aapl-q1-2022-speaker-name-map-v2.yaml index eba2485..485a4c5 100644 --- a/tests/data/aapl-q1-2022-speaker-name-map-v2.yaml +++ b/tests/data/aapl-q1-2022-speaker-name-map-v2.yaml @@ -640,4 +640,4 @@ responses: x-amz-server-side-encryption: AES256 method: GET status: 200 - url: https://v2.api.earningscall.biz/transcript?apikey=demo&exchange=NASDAQ&symbol=AAPL&year=2023&quarter=1&level=2 + url: https://api.earningscall.dev/transcript?apikey=demo&exchange=NASDAQ&symbol=AAPL&year=2023&quarter=1&level=2 diff --git a/tests/data/aapl-q1-2023-level-2-schema-v4.yaml b/tests/data/aapl-q1-2023-level-2-schema-v4.yaml new file mode 100644 index 0000000..8871448 --- /dev/null +++ b/tests/data/aapl-q1-2023-level-2-schema-v4.yaml @@ -0,0 +1,675 @@ +responses: +- response: + auto_calculate_content_length: false + body: '{"exchange":"NASDAQ","symbol":"AAPL","company_name":"Apple Inc.","level":2,"event":{"year":2023,"quarter":1,"conference_date":"2023-02-02T17:00:00-05:00"},"speakers":[{"speaker":{"id":"spk12","name":"Teja + Skala","title":"Director of Investor Relations and Corporate Finance"},"text":"Good + day, everyone, and welcome to the Apple Q1 Fiscal Year 2023 Earnings Conference + Call. Today\u0027s call is being recorded. And now at this time, for opening + remarks and introductions, I would like to turn the call over to Teja Skala, + Director of Investor Relations and Corporate Finance. Please go ahead."},{"speaker":{"id":"spk07","name":"Operator"},"text":"Thank + you. Speaking first today is Apple CEO Tim Cook, and he\u0027ll be followed + by CFO Luca Maestri. After that, we\u0027ll open the call to questions from + analysts. Before turning the call over to Tim, I would like to remind everyone + that the December quarter spanned 14 weeks, while the March quarter, as usual, + has 13 weeks. Please note that some of the information you\u0027ll hear during + our discussion today will consist of forward-looking statements including, without + limitation, those regarding revenue, gross margin, operating expenses, other + income and expense, taxes, capital allocation, and the future business outlook, + including the potential impact of COVID-19 on the company\u0027s business and + results of operations. These statements involve risks and uncertainties that + may cause actual results or trends to differ materially from our forecast. For + more information, please refer to the risk factors discussed in Apple\u0027s + most recently filed annual report on Form 10-K and the Form 8-K filed with the + SEC today, along with the associated press release. Apple assumes no obligation + to update any forward-looking statements or information which speak as of their + respective dates. I\u0027d now like to turn the call over to Tim for introductory + remarks."},{"speaker":{"id":"spk01","name":"Tim Cook","title":"CEO"},"text":"Thank + you, Tejas. Good afternoon, everyone, and thanks for joining us. Today we\u0027re + reporting revenue of $117.2 billion for the December quarter. We set all-time + revenue records in a number of markets, including Canada, Indonesia, Mexico, + Spain, Turkey, and Vietnam, along with quarterly records in Brazil and India. + As a result of a challenging environment, our revenue was down 5% year over + year. But I\u0027m proud of the way we have navigated circumstances seen and + unforeseen over the past several years, and I remain incredibly confident in + our team, in our mission, and in the work we do every day. Let me discuss the + three factors that impacted our revenue performance during the quarter. The + first was foreign exchange headwinds, which had a nearly 800 basis point impact. + On a constant currency basis, we grew year over year and would have grown in + the vast majority of the markets we track. The second factor, which we described + in a November 6th update, was COVID-19-related challenges, which significantly + impacted the supply of iPhone 14 Pro and iPhone 14 Pro Max and lasted through + most of December. Because of these constraints, we had significantly less iPhone + 14 Pro and iPhone 14 Pro Max supply than we planned, causing ship times to extend + far beyond what we had anticipated. As we always have every step of the way + throughout the pandemic, we continue to prioritize people and work with our + suppliers to ensure the health and safety of every worker. Production is now + back where we want it to be. The third factor was a challenging macroeconomic + environment as the world continues to face unprecedented circumstances from + inflation to war in Eastern Europe to the enduring impacts of the pandemic. + And we know that Apple is not immune to it. But whatever conditions we face, + our approach is always the same. We are thoughtful and deliberate. We manage + for the long term. We adapt quickly to circumstances outside our control while + delivering with excellence in the things we can. We invest in innovation, in + people, and in the positive difference we can make in the world. And we do it + all to provide our customers with technology that will enrich their lives and + help unlock their full creative potential. It\u0027s a wonderful thing to be + a part of, and it\u0027s so rewarding for all of us at Apple when we hear how + much our customers are loving what we create. Let me talk now about what we + saw across our product categories. Starting with iPhone, revenue came in at + $65.8 billion for the quarter, down 8% year over year. However, on a constant + currency basis, iPhone revenue was roughly flat. Our customers continue to rave + about the astounding camera capabilities and unprecedented battery life and + the groundbreaking suite of health and safety features. The iPhone 14 lineup + pushes the limits of what users can do with a smartphone. During the quarter, + Mac revenue came in at $7.7 billion, which was in line with what we had expected. + We had a difficult compare because this time last year we had the extremely + successful launch of the redesigned M1 MacBook Pros. We also faced a challenging + macroeconomic environment and foreign exchange headwinds. We remain confident + in and focused on the long-term opportunity for Mac. Just last month, we introduced + new MacBook Pro models powered by our latest developments in Apple silicon, + M2 Pro and M2 Max. These chips enable unprecedented performance and do so with + less energy, which is not only good for the environment, but gives the newest + MacBook Pro the longest battery life ever in a Mac. We also introduced the M2-powered + Mac Mini, which will supercharge productivity for users of all kinds and leave + them stunned by just how powerful a Mac Mini can be. During the quarter, iPad + revenue grew 30% to a total of $9.4 billion. The very strong growth was due + in part to a favorable compare to the December quarter a year ago when we experienced + significant supply constraints. Customers continue to praise our new lineup + for its versatility, whether it\u0027s the new iPad Pro, now powered by the + M2, or the newly designed iPad 10th generation with its stunning liquid retina + display and beautiful colors. Revenue for wearables, home, and accessories was + $13.5 billion, which was down 8% year over year, driven by foreign exchange + headwinds and a challenging macroeconomic environment. We remain excited about + the long-term opportunity in the category. As an example, a few weeks ago, we + announced the Next Generation HomePod, which is an indispensable addition to + the smart home. This powerful smart speaker relies on advanced computational + audio to produce an incredible listening experience. We\u0027re also helping + users make their home safer with sound recognition. This feature, arriving later + this spring, allows HomePod to send a notification directly to a user\u0027s + iPhone if a smoke or carbon monoxide alarm sound is identified. We continue + to hear wide praise for Apple Watch Series 8 and Apple Watch Ultra, which has + set a new standard for what\u0027s possible with a wearable. From a whole host + of health and safety features to incredible new capabilities for extreme athletes, + there is something for everyone in these amazing products. Customers are excited + about some phenomenal new features we\u0027ve made available across many of + our products as well. One of the highlights is emergency SOS via satellite, + which launched for iPhone 14 customers in the US and Canada in November, and + for customers in France, Germany, Ireland, and the UK in December. This is a + feature we hope our users will never need, but it is incredibly heartening to + get emails from people describing the life-saving impact our new safety features + have had on them. We\u0027re always looking for new ways to empower people to + create and collaborate. In December, we released Freeform, a brand new app that + lets users take their ideas wherever they want, anywhere they are, all while + collaborating in real time. Freeform has already received praise from reviewers + for its flexibility and simplicity as it works seamlessly across iPhone, iPad, + and Mac. Today, we are very excited to announce that we\u0027ve achieved a truly + incredible milestone. Thanks to our deep commitment to innovation, incredible + customer loyalty and satisfaction, and a large number of switchers, we now have + more than 2 billion active devices as part of our growing installed base, double + what it was just seven years ago. This is an incredible testament to our products + and services and the strength of our ecosystem. We set an all-time revenue record + of $20.8 billion in services, which was better than what we had expected. We + achieved double-digit revenue growth from App Store subscriptions and set all-time + revenue records across a number of categories, including cloud and payment services. + All told, Apple now has more than 935 million paid subscriptions. Apple has + also just begun a historic 10-year partnership with Major League Soccer. Just + yesterday, we launched MLS Season Pass, which will give fans in more than 100 + countries access to every live MLS regular season game, as well as the playoffs + and MLS Cup, all with no blackouts. And while we\u0027re providing more content + to sports fans than ever before, Apple TV Plus continues to showcase powerful + characters and moving storytelling. We were thrilled to celebrate the holidays + alongside our Apple TV Plus subscribers with the hit movie Spirited, and we\u0027re + delighted to see how much people are enjoying new and returning series like + Shrinking, Slow Horses, and Truth Be Told. and we have some great upcoming movies + in Sharper and Tetris, along with Emmy Award winner Ted Lasso returning this + spring. During the quarter, we made some great updates to Fitness Plus as well, + expanding our catalog of more than 3,500 workouts and meditations to include + a new kickboxing category and a new sleep theme for meditations. Our latest + artist spotlight series features the music of the incomparable Beyonce, and + we\u0027re excited to take a stroll with guests appearing on our fifth season + of Time to Walk. And we continue to build on our decades-long commitment to + helping small businesses thrive when we announced Apple Business Connect. This + new tool gives business owners even more control over how billions of people + see and engage with their products and services every day. Businesses of all + sizes can now customize key information for users across Apple Maps, Messages, + Wallet, Siri, and other apps. Meanwhile, in retail, we celebrated 25 years of + the Apple online store and also opened Apple Pacific Center in Vancouver and + Apple American Dream in New Jersey. And I\u0027m grateful to all the teams who + helped our customers throughout the busy holiday season. At Apple, we spend + a lot of time focused on creating an unparalleled experience for our customers + in every product and service that we offer. We\u0027re also just as dedicated + to leading with our values in everything we do. As part of that work, we strengthened + our deep commitment to privacy and security, giving users three new tools to + protect their most sensitive data. iMessage contact key verification, security + keys for Apple ID, and advanced data protection for iCloud. At Apple, we feel + a deep sense of responsibility to leave the world better than we found it. We\u0027re + also a year closer to 2030, and we remain ever focused on the environmental + commitments we set out for the end of the decade. As an example, the latest + Mac Mini and MacBook Pro models all use 100% recycled aluminum in the enclosure + and recycled rare earth elements in all magnets. And in a first for HomePod, + we\u0027re using 100% recycled gold in the plating of multiple printed circuit + boards. In honor of Black History Month, we released the Black Unity Collection, + including the special edition Apple Watch Black Unity Sport Loop, a new matching + watch face, and iPhone wallpaper. Through our racial equity and justice initiative, + we\u0027re expanding our support of five organizations focused on lifting up + communities of color through technology. And we are committed, as ever, to building + on our progress around inclusion and diversity. During the quarter, we also + announced that since the inception of our giving program 11 years ago, we\u0027ve + donated more than $880 million to humanitarian efforts, disaster relief, childhood + education, and more. And over the last 16 years through our partnership with + REDD, Apple supported grants have helped more than 11 million people get the + care and support services they need. As we look ahead in 2023, we are excited + about the year to come. At Apple, we are always looking forward, always focused + on the next challenge, always determined to do great things with unmatched creativity + and unrivaled innovation. And that makes me more confident about the future + of Apple than I have ever been. With that, I\u0027ll turn it over to Luca."},{"speaker":{"id":"spk05","name":"Luca + Maestri","title":"CFO"},"text":"Thank you Tim, and good afternoon everyone. + As Tim mentioned, revenue for the December quarter was $117.2 billion, down + 5% from last year. A number of factors had a significant impact on our results. + First, we faced a very difficult foreign exchange environment, which affected + our performance by nearly 800 basis points. In other words, we grew revenue + on a constant currency basis, and in fact, we did so in the vast majority of + markets. Second, the macroeconomic environment this past quarter was markedly + more challenging than 12 months ago. Third, we experienced significant supply + shortages for iPhone 14 Pro and iPhone 14 Pro Max in November and through December. + On the other hand, we had the positive impact of the 14th week in the quarter + that Tejas mentioned at the beginning of the call. Products revenue was 96.4 + billion, down 8% from last year due to the factors I just called out. At the + same time, however, our installed base of active devices grew double digits + and achieved all-time records in each geographic segment and in each major product + category. We are proud to now have over 2 billion active devices in our installed + base. This continued growth in the installed base is due to extremely strong + levels of customer satisfaction and loyalty and a high number of customers who + are new to our products. The installed base growth also helped our services + set an all-time revenue record of $20.8 billion, up 6% over a year ago. We achieved + this new milestone despite more than 700 basis points of negative impact from + foreign exchange. We reached all-time services revenue records in the Americas, + Europe, and rest of Asia Pacific, and a December quarter record in Greater China. + We also set records in many services categories, including all-time revenue + records for cloud services, payment services, and music, and December quarter + records for the App Store and AppleCare. Company gross margin was 43%, up 70 + basis points from last quarter, due to leverage and favorable mix, partially + offset by foreign exchange. Products gross margin was 37%, up 240 basis points + sequentially, and services gross margin was 70.8%, up 30 basis points sequentially, + both due to the same factors that impacted total company gross margin. Operating + expenses of 14.3 billion were significantly below the guidance range we provided + at the beginning of the quarter, and grew at a slower pace than in the past, + as we took actions to respond to the current macro environment. Net income was + 30 billion, diluted earnings per share were $1.88, and we generated very strong + operating cash flow of 34 billion. Let me now get into more detail for each + of our revenue categories. iPhone revenue was $65.8 billion, despite significant + foreign exchange headwinds, supply constraints on iPhone 14 Pro and iPhone 14 + Pro Max, and a challenging microeconomic environment. In spite of these circumstances, + we set all-time iPhone revenue records in Canada, Italy, and Spain, and saw + strong growth in several emerging markets, including all-time iPhone revenue + records for India and Vietnam. Importantly, the installed base of active iPhones + continues to grow nicely and is at an all-time high across all geographic segments. + In emerging markets in particular, the installed base grew double digits, and + we had record levels of switchers in India and in Mexico. Our customers continue + to love their experience with our products, with the latest survey of US consumers + from 451 Research indicating customer satisfaction of 98% for the iPhone 14 + family. Mac revenue was $7.7 billion, down 29% year-over-year and in line with + our expectations. There were three key drivers for our Mac results. First, we + had a challenging compare against last year\u0027s launch of the completely + reimagined MacBook Pros, our first notebooks with M1 Pro and M1 Macs. Second, + we believe that the macro environment impacted our Mac performance. And third, + we faced significant foreign exchange headwinds. At the same time, however, + the installed base of active Macs reached an all-time high across all geographic + segments. And we continue to see very strong upgraded activity to Apple Silicon. + Customer satisfaction with Mac remains very strong at 96% based on the latest + survey of US consumers from 451 research. iPad revenue was $9.4 billion, up + 30% year-over-year, despite significant FX headwinds. This performance was driven + by two key items. First, during the December quarter a year ago, we experienced + significant supply constraints, while this year we had enough supply to meet + demand. Second, we launched our new iPad and the iPad Pro powered by the M2 + chip during the quarter. The iPad install base reached a new all-time high thanks + to incredible customer loyalty and a high number of new customers. In fact, + over half of the customers who purchased iPads during the quarter were new to + the product. Wearables, home, and accessories revenue was $13.5 billion, down + 8% year over year. The year-over-year decline was driven by significant FX headwinds + and a challenging macroeconomic environment. However, our installed base of + devices in the category set a new all-time record thanks to the largest number + of customers new to a smartwatch that we\u0027ve ever had in a given quarter. + In fact, nearly two-thirds of customers purchasing an Apple Watch during the + quarter were new to the product. Moving to services, we generated $20.8 billion + in revenue, a new all-time record in total and for many services offerings, + in spite of a difficult foreign exchange environment, and macroeconomic headwinds + impacting certain categories such as digital advertising and mobile gaming. + In constant currency, we grew services revenue double digits on top of growing + 24% during the December quarter a year ago. We remain focused on the large long-term + opportunity in this category, and we continue to observe several trends that + reflect the strength of our ecosystem. For example, we saw increased customer + engagement with our services during the quarter. Both our transacting accounts + and paid accounts grew double digits year over year, each setting a new all-time + record. Paid subscriptions also continue to grow nicely. We now have more than + 935 million paid subscriptions across the services on our platform, up more + than 150 million during the last 12 months alone, and nearly four times what + we had just five years ago. and we continue to increase the reach and improve + the quality of our offerings. For instance, Apple Pay is now available to millions + of merchants in nearly 70 countries and regions, and we saw a record-breaking + number of purchases made using Apple Pay globally during the holiday shopping + season. Finally, our installed base of over 2 billion active devices represents + a great foundation for future expansion of our ecosystem. And it continues to + grow even during difficult macroeconomic conditions, which speaks to the exceptionally + high levels of customer loyalty and satisfaction and our ability to attract + new customers to our platform. The growth is coming from every major product + category and geographic segment, with strong double-digit increases in emerging + markets, such as Brazil, Mexico, India, Indonesia, Thailand, and Vietnam. Turning + to the enterprise market, we are seeing continued adoption of our services for + business. like Apple Business Essentials, AppleCare, Tap2Pay, and Apple Financial + Services. For example, Mars Incorporated has expanded its use of AppleCare for + Enterprise to provide timely device support and assurance for iPads deployed + across their manufacturing sites. Meanwhile, HCA Healthcare has leveraged Apple + Financial Services to manage the annual refresh of its entire fleet of iPhones. + This not only ensures that their staff stay current on the latest Apple technology, + but also provides them with significant annual savings in the process. Let me + now turn to our capital return program and our cash position. We returned over + $25 billion to shareholders during the December quarter as our business continues + to generate very strong cash flow. This included $3.8 billion in dividends and + equivalents and $19 billion through open market repurchases of 133 million Apple + shares. We ended the quarter with $165 billion in cash and marketable securities. + We repaid $1.4 billion in maturing debt and decreased commercial paper by $8.2 + billion, leaving us with total debt of $111 billion. As a result, net cash was + $54 billion at the end of the quarter, and we maintain our goal of becoming + net cash neutral over time. As we move into the March quarter, I\u0027d like + to review our outlook, which includes the types of forward-looking information + that Tejas referred to at the beginning of the call. Given the continued uncertainty + around the world in the near term, we are not providing revenue guidance, but + we are sharing some directional insights based on the assumption that the microeconomic + outlook and COVID-related impacts to our business do not worsen from what we + are projecting today for the current quarter. In total, we expect our March + quarter year-over-year revenue performance to be similar to the December quarter. + This represents an acceleration in our underlying year-over-year business performance + as the December quarter benefited from an extra week. For an exchange, we\u0027ll + continue to be a headwind, and we expect a negative year-over-year impact of + five percentage points. For services, we expect revenue to grow year-over-year, + while continuing to face macroeconomic headwinds in areas such as digital advertising + and mobile gaming. For iPhone, we expect our March quarter year-over-year revenue + performance to accelerate relative to the December quarter year-over-year revenue + performance. For Mac and iPad, we expect revenue for both product categories + to decline double digits year-over-year because of challenging compares and + macroeconomic headwinds. We expect gross margin to be between 43.5% and 44.5%. + We expect OPEX to be between $13.7 and $13.9 billion. We expect OINE to be around + negative $100 million, excluding any potential impact from the mark-to-market + of minority investments, and our tax rate to be around 16%. Finally, today our + board of directors has declared a cash dividend of 23 cents per share of common + stock, payable on February 16, 2023, to shareholders of record as of February + 13, 2023. With that, let\u0027s open the call to questions."},{"speaker":{"id":"spk07","name":"Operator"},"text":"Thank + you, Luca. We ask that you limit yourself to two questions. Operator, may we + have the first question, please?"},{"speaker":{"id":"spk12","name":"Teja Skala","title":"Director + of Investor Relations and Corporate Finance"},"text":"Certainly. We will go + ahead and take our first question from David Bott with UBS."},{"speaker":{"id":"spk10","name":"David + Bott","title":"UBS Analyst"},"text":"Great. Thanks, guys, for taking my question. + So, Tim, and maybe this is for Luca as well, you talked about the supply chain + returning back to normal after a very difficult October-November, but we\u0027re + still seeing some disruptions across tech products, whether it\u0027s enterprise + or consumer-facing. How do you think about your supply chain and maybe the levels + of inventory or bills that you might need as we go forward to sort of insulate + your business from these sort of episodic disruptions? Have you changed your + view? And if so, how does that affect ultimately margins and sort of your balance + sheet and cash flow items going forward? Thanks."},{"speaker":{"id":"spk01","name":"Tim + Cook","title":"CEO"},"text":"This is Tim, David. From a supply point of view, + we did see disruption from early November through most of December. And from + a supply chain point of view, We\u0027re now at a point where production is + what we need it to be, and so the problem is behind us. In terms of going forward + in the supply chain, we build our products everywhere. There are component parts + coming from many different countries in the world and the final assembly coming + from from three countries in the world on just iPhone. And so we continue to + optimize it. We\u0027ll continue to optimize it over time and change it to continue + to improve. I think when you sort of zoom out and back up from it, the last + three years have been a pretty difficult time between COVID and silicon shortages + and the like, and I think we have had a very resilient supply chain in the aggregate. + In terms of supply for this quarter, which I think was one of your points, I + think we\u0027re in decent supply on most products for the quarter currently."},{"speaker":{"id":"spk13","name":"Harsh + Kumar","title":"Piper Sandler Analyst"},"text":"Great, thank you."},{"speaker":{"id":"spk01","name":"Tim + Cook","title":"CEO"},"text":"Yeah."},{"speaker":{"id":"spk07","name":"Operator"},"text":"Great. + Thanks. Can we have the next question, please?"},{"speaker":{"id":"spk12","name":"Teja + Skala","title":"Director of Investor Relations and Corporate Finance"},"text":"Our + next question is from Shannon Cross of Credit Suisse."},{"speaker":{"id":"spk11","name":"Shannon + Cross","title":"Credit Suisse Analyst"},"text":"Thank you very much. Luca, I + wanted to dig a bit more into the commentary on gross margin. The guidance, + especially 43.5 to 44.5 is obviously quite strong. So I\u0027m wondering what\u0027s + helping you out there? some mix and some other things. And then, you know, how + should we think about what currency and hedging is going to do as we look forward? + And then I have a follow-up."},{"speaker":{"id":"spk05","name":"Luca Maestri","title":"CFO"},"text":"Shannon? + Yes, I mean, we\u0027ve had good margin for the December quarter to start with. + We reported 43%. Obviously, in December, we have the benefit of leverage because + of the seasonality of the business. But we also had favorable mix across the + board. Of course, foreign exchange is an issue right now. In the December quarter, + on a sequential basis, foreign exchange was a negative 110 basis points for + us. And on a year-over-year basis, it\u0027s 300 basis points. So obviously, + the FX environment has changed a lot during the last 12 months. For March, yeah, + we\u0027ve seen a margin expansion, 43.5% to 44.5%. We\u0027re doing a lot of + work around cost, of course, you know, mix will continue to help both within + categories and services mix as we move away from the holiday season. But we\u0027re + doing a lot of work on the cost structure, and that is paying off. Foreign exchange + is still a negative, about 50 basis points sequentially, but it\u0027s mitigating. + The last couple of weeks, the dollar has weakened a bit. And so hopefully, as + we go through the year, hopefully things will improve. But for now, as you correctly + state, we are in a good position on margins."},{"speaker":{"id":"spk11","name":"Shannon + Cross","title":"Credit Suisse Analyst"},"text":"Thank you. And then, Tim, can + you talk a bit about China, what you\u0027re seeing? Obviously, you had the + issues with production, but I mean more on the demand side. As we\u0027ve gotten + through Chinese New Year and the opening, I\u0027m just wondering, are you seeing + the Chinese consumer come back? What are they buying, and how are you thinking + about your position there? Thank you."},{"speaker":{"id":"spk01","name":"Tim + Cook","title":"CEO"},"text":"Shannon, last quarter, we declined by 7% on a reported + basis, but we actually grew on a constant currency basis. And that was despite + some significant of the supply constraints that we talked about earlier. And + obviously the sort of the COVID restrictions throughout China that happened + in various different places throughout the country, uh also impacted the the + demand during the quarter uh when you look at uh the opening that started happening + in december we saw a marked change in traffic in our stores as compared to november + and that followed through to demand as well and I don\u0027t want to get into + January. We\u0027ve obviously for January is included in the guidance or the + color rather that Luca provided earlier. But we did see a marked change from + December compared to November."},{"speaker":{"id":"spk12","name":"Teja Skala","title":"Director + of Investor Relations and Corporate Finance"},"text":"Thank you."},{"speaker":{"id":"spk07","name":"Operator"},"text":"Yeah. + Great. Thanks, Shannon. Can we have the next question, please?"},{"speaker":{"id":"spk12","name":"Teja + Skala","title":"Director of Investor Relations and Corporate Finance"},"text":"Our + next question is from Eric Woodring of Morgan Stanley."},{"speaker":{"id":"spk08","name":"Eric + Woodring","title":"Morgan Stanley Analyst"},"text":"Hey, guys. Thanks for taking + my questions. Maybe, Tim, first one for you. That $2 billion device install + base figure, that\u0027s up, I believe, 200 million units year over year. That + implies the strongest annual gain in new devices. And your install base is basically + as far back as you\u0027ve provided those data points. And so I guess my two + questions are, one, can you provide the install base for the iPhone at year-end? + And then two, is there anything that you see in this new cohort of users that + might look different or similar to past cohorts, either by demographic or regions + or monetization ramp? And then I will follow up. Thanks."},{"speaker":{"id":"spk01","name":"Tim + Cook","title":"CEO"},"text":"Yeah, the install base is now over 2 billion active + devices, as you mentioned. And we set records across each geographic segment + and major product category. And so it was a broad-based change. To correct one + thing you said, it\u0027s up over 150 million year over year. The last report + we reported to be over 1.85. And so it\u0027s 150, which we\u0027re very proud + of. We also saw strong double digit in several of the emerging markets, which + is very important to us. For example, India and Brazil as just two examples. + So very, very strong and obviously it bodes well for the future."},{"speaker":{"id":"spk08","name":"Eric + Woodring","title":"Morgan Stanley Analyst"},"text":"Great. Thank you for the + color, Tim. And then, you know, Luca, obviously the December quarter was negatively + impacted by the production challenges. Can you just maybe unpackage where channel + inventory levels are today kind of across the iPhone broadly? And then, you + know, what the data that you\u0027re seeing so far this quarter is telling you + about iPhone demand deferral versus kind of iPhone demand destruction and perhaps + pushing some upgrades later into the year rather than into March quarter? And + that\u0027s it for me. Thanks."},{"speaker":{"id":"spk01","name":"Tim Cook","title":"CEO"},"text":"Yeah, + Eric, I\u0027ll take that one as well. The channel inventory levels on iPhone, + we obviously ended the December quarter below our target range, given the supply + challenges on iPhone 14 Pro and iPhone 14 Pro Max. But as you think about this, + keep in mind that a year ago, we also exited the December quarter below our + target inventory range. because of supply challenges in the year-ago quarter. + Not related, not the same issue by, just as a point. And so that hopefully gives + you some flavor of that. In terms of what we\u0027re seeing in January, we\u0027ve + included In our color that Luca provided, kind of our thinking, it\u0027s very + hard to estimate the recapture because you have to know exactly what would have + happened and how many people bought down, and it takes a while to get those + reports. in during the quarter. And so we\u0027ve made our best guess at it. + In terms of the sizing of the constraint in Q1, what we estimate, although not + with precision, is that we would, I thought we believe iPhone would have grown + during the quarter had it not been for the supply shortages. So hopefully that + provides you a little bit of color."},{"speaker":{"id":"spk08","name":"Eric + Woodring","title":"Morgan Stanley Analyst"},"text":"Yep, that\u0027s great. + Thanks so much."},{"speaker":{"id":"spk07","name":"Operator"},"text":"Thanks, + Eric. Can we have the next question, please?"},{"speaker":{"id":"spk12","name":"Teja + Skala","title":"Director of Investor Relations and Corporate Finance"},"text":"Our + next question comes from Aaron Rakers of Wells Fargo."},{"speaker":{"id":"spk02","name":"Aaron + Rakers","title":"Wells Fargo Analyst"},"text":"Yeah, thanks for taking the question. + I have two as well, if I can. I guess the first kind of question, just going + back on the gross margin line, you know, pretty good guidance into this March + quarter. I\u0027m curious if you unpack that a little bit, specific around what + you\u0027re seeing as far as, you know, maybe benefits from component pricing."},{"speaker":{"id":"spk05","name":"Luca + Maestri","title":"CFO"},"text":"um you know in in the guidance uh if you\u0027re + embedding any of that at this point yeah of course you know with our guidance + we try to capture every aspect uh of our cost structure and obviously components + are a big portion of that yeah so definitely that\u0027s that\u0027s included + and keep in mind again that Foreign exchange, I mentioned earlier, I think to + Shannon, that the sequential negative on FX is 50 basis points versus a year + ago, it\u0027s 270 basis points. Obviously, the US dollar has moved a lot over + the last 12 months. So obviously, we need to find offsets and more to the negative + FX in order to be able to provide this kind of guidance. And so obviously, components + are a big part of that."},{"speaker":{"id":"spk02","name":"Aaron Rakers","title":"Wells + Fargo Analyst"},"text":"Yep. And then kind of, you know, from a strategic perspective, + given kind of the things that we\u0027re seeing out in some of your peer group, + I\u0027m curious, Tim, how you think about, you know, the role of AI in your + strategy as far as particularly in the services segment, whether you see opportunities + to excel monetization abilities within the paid subscriber base and whether + or not AI is something that you\u0027re implementing a bit more strategically + there."},{"speaker":{"id":"spk01","name":"Tim Cook","title":"CEO"},"text":"Yeah, + it is a major focus of ours. It\u0027s incredible in terms of how it can enrich + customers\u0027 lives. And you can look no further than some of the things that + we announced in the fall with crash detection and fall detection. or back aways + with ECG. I mean, these things have literally saved people\u0027s lives. And + so we see an enormous potential in this space to affect virtually everything + we do. It\u0027s obviously a horizontal technology, not a vertical. And so it + will affect every product and every service that we have."},{"speaker":{"id":"spk07","name":"Operator"},"text":"Thanks. + Can we have the next question, please?"},{"speaker":{"id":"spk12","name":"Teja + Skala","title":"Director of Investor Relations and Corporate Finance"},"text":"Certainly. + Our next question comes from Amit Daryanani of Evercore."},{"speaker":{"id":"spk03","name":"Amit + Daryanani","title":"Evercore Analyst"},"text":"Thanks for taking my question. + Yes, the first one I have is, Tim, I think basically earlier comments that iPhones + would have grown X the production issue would imply that maybe it\u0027s a $7 + billion or so impact that you had in December quarter from the production challenges + on the high-end models. I\u0027m sure it\u0027s tough to see what happens this + summer round, but I think historically when you\u0027ve had production issues + or things like this happen, what has the consumer behavior been typically? Do + they tend to go down towards the lower-end models and get the phone they want + quickly, or do they just defer their production? Just from a historical perspective, + I think. Do you typically recover what\u0027s deferred out, or no?"},{"speaker":{"id":"spk01","name":"Tim + Cook","title":"CEO"},"text":"It\u0027s very hard to estimate is the real answer + because you have to know a lot of data and it\u0027s usually only in hindsight + that you have a more reasonable view of it. And so we put our best views in + the color that Luca provided. That\u0027s kind of what I would say."},{"speaker":{"id":"spk03","name":"Amit + Daryanani","title":"Evercore Analyst"},"text":"All right. And then, you know, + I guess maybe if I think about services as you go forward, and, you know, you\u0027ve + had really good growth in services, I think, over the last several years, but + as you go forward in services, you know, what do you think drives the growth + more so? Is it the expansion of your install base, or is it more going to be + driven by, you know, our pool going higher for you? I\u0027m just curious, how + do you think about those two buckets as you go forward?"},{"speaker":{"id":"spk05","name":"Luca + Maestri","title":"CFO"},"text":"I mean, there\u0027s a number of things, and + I mentioned a few of them during the call, but The first step is always the + install base. The install base is the engine for services growth. And the fact + that the install base is growing very nicely and it\u0027s growing, you know, + in a lot of emerging markets is growing even faster. That gives us, you know, + a larger addressable pool of customers. That\u0027s incredibly important. The + second one is that we are seeing that the level of engagement of our customers + already in our ecosystem continues to grow. I mentioned that both transacting + accounts and paid accounts grew double digits. And so that bodes very well for + the future. And we have a lot of transacting accounts that can move to paid + accounts over time. The other aspect that is very important for us is to continue + constantly to improve the reach and the quality of our services. And I give + the example of Apple Pay, which it\u0027s a great example because we started + off primarily in the United States. Now we\u0027ve taken it to 70 markets, millions + of merchants. And so obviously payment services continue to set new highs all + the time for us. And as you\u0027ve seen over the last few years, we also launched + new services over time, and that obviously contributes to the growth. We\u0027re + very excited. And when we look at the behavior of our installed base, we think + it\u0027s very promising for the continued growth of our services business."},{"speaker":{"id":"spk07","name":"Operator"},"text":"Perfect. + Thank you. Thanks, Amit. Can we have the next question, please?"},{"speaker":{"id":"spk12","name":"Teja + Skala","title":"Director of Investor Relations and Corporate Finance"},"text":"Our + next question comes from harsh Kumar Piper Sandler."},{"speaker":{"id":"spk13","name":"Harsh + Kumar","title":"Piper Sandler Analyst"},"text":"Yeah. Hey, uh, Tim, I had a + quick question on emerging markets. Uh, it seems like you\u0027re making a lot + of strikes in India, uh, potentially wanted to understand the kind of share + you have in China and India. And relative to that, what would be your aspirational, + but sort of achievable share in iPhones in those territories, whether it\u0027s + units or revenues, And I was hoping to draw on your experience with what you\u0027ve + seen in other countries where you\u0027ve had some longer presence."},{"speaker":{"id":"spk01","name":"Tim + Cook","title":"CEO"},"text":"And looking at the business in India, we set a + quarterly revenue record and grew very strong double digits year over year. + And so we feel very good about how we performed. And that\u0027s despite the + headwinds that we\u0027ve talked about. Taking a step back, India is a hugely + exciting market for us and is a major focus. We brought the online store there + in 2020. We will soon bring Apple retail there. So we\u0027re putting a lot + of emphasis on the market. There\u0027s been a lot done from a financing options + and trade-ins to make products more affordable and give people more options + to buy. And so there\u0027s a lot going on there. We\u0027re in essence taking + what we learned in China years ago and how we scaled China and bringing that + to bear. And I don\u0027t have the exact market shares in front of me, but I + think you would see that from a market share point of view that we grew around + the world last quarter on iPhone, despite the challenges that we had on the + supply side. And I wouldn\u0027t expect to have a difference in those two markets."},{"speaker":{"id":"spk13","name":"Harsh + Kumar","title":"Piper Sandler Analyst"},"text":"Understood. And for my follow-up, + I had sort of an interesting theoretical question on pricing. Assuming we get + the CHIP Act passed and there\u0027s a whole bunch of manufacturing that happens + in U.S. and other territories that are potentially somewhat more expensive than + the ones you might be in now, has the company done any studies to gauge the + elasticity of demand relative to small price increases in your products?"},{"speaker":{"id":"spk01","name":"Tim + Cook","title":"CEO"},"text":"We have experience in that, but I wouldn\u0027t + necessarily draw the same conclusion that you have in terms of the cost of the + product. We don\u0027t know at this point exactly what that will be. We\u0027re + all in in terms of being the largest customer for TSMC in Arizona and are very + proud to take part in that. That\u0027s what I would say about that."},{"speaker":{"id":"spk13","name":"Harsh + Kumar","title":"Piper Sandler Analyst"},"text":"Okay, fair enough. Thank you, + Tim."},{"speaker":{"id":"spk07","name":"Operator"},"text":"Yep. Thanks. Can + we have the next question, please?"},{"speaker":{"id":"spk12","name":"Teja Skala","title":"Director + of Investor Relations and Corporate Finance"},"text":"Sure. Our next question + comes from Wamsi Moan of Bank of America."},{"speaker":{"id":"spk04","name":"Wamsi + Moan","title":"Bank of America Analyst"},"text":"Yes, thank you. Tim, you\u0027ve + done a phenomenal job of driving consumer choice towards higher-end products + within your portfolio. How would you compare this cycle for iPhones if you were + to segment the pro versus non-pro models versus the cycles from the past few + years? And do you think this move to higher ASPs is sustainable, or do you think + it reverses in a tighter consumer spending environment? I\u0027ll have a follow-up."},{"speaker":{"id":"spk01","name":"Tim + Cook","title":"CEO"},"text":"The pro has been a 14 pro and the 14 pro max have + done extremely well up until the point where we had a supply shortage and couldn\u0027t + provide them, couldn\u0027t provide the total of the demand. And so it\u0027s + definitely a strong pro cycle. I think there\u0027s a number of reasons for + that, but the most important one is always the product. And I think the innovations + in the product speak for themselves. And we feel very good about the product + that we announced back in September and are happy to now be at a point where + we\u0027re shipping to the demand."},{"speaker":{"id":"spk04","name":"Wamsi + Moan","title":"Bank of America Analyst"},"text":"Tim, do you think that this + move to sort of higher ASPs that has happened over the last few years is sustainable + or could it sustain in this very tough macro environment that you\u0027ve cited?"},{"speaker":{"id":"spk01","name":"Tim + Cook","title":"CEO"},"text":"I wouldn\u0027t want to predict, but I would say + that the smartphone for us, the iPhone, has become so integral into people\u0027s + lives. It contains their contacts and their health information and their banking + information and their smart home and so many different parts of their lives. + It\u0027s their payment vehicle and for many people. And so I think people are + willing to really stretch to get the best they can afford in that category."},{"speaker":{"id":"spk04","name":"Wamsi + Moan","title":"Bank of America Analyst"},"text":"Okay, great. And, Tim, you + clearly emphasize the focus and importance of the install base. If we think + about the absolute grip of the install base from $1 billion to $2 billion over + seven years from a device standpoint, how should we think about the penetration + of services or the growth in paying customers on services over that time frame? + Is that penetration rate increasing or decreasing, how fast is that growing + relative to the growth of the overall install base?"},{"speaker":{"id":"spk05","name":"Luca + Maestri","title":"CFO"},"text":"It\u0027s Luca. And yes, of course, you know, + we keep track of that. It\u0027s really, really important for us. Over the last + seven years, as we\u0027ve doubled the install base, we\u0027ve seen a growing + engagement of our customers on the platform. That happens, first of all, by + customers transacting on the platform and then moving to paid accounts. So starting + to pay for some of the services. uh that percentage of paid accounts tends to + grow over time we\u0027ve seen it in developed markets we see it in emerging + markets and that is due to some of the reasons that i was explaining earlier + including the fact that we made it easier for our for our customers to get engaged + on the platform for example we offer multiple payment methods in in many countries + uh and we\u0027ve made it easier to explore for more services because we\u0027ve + added a lot of services on the platform over the last over the last seven years + so to your question of course higher engagement means a higher percentage of + paid accounts over time okay thank you all right thanks wamsi can we have the + next question please"},{"speaker":{"id":"spk12","name":"Teja Skala","title":"Director + of Investor Relations and Corporate Finance"},"text":"Our next question comes + from Richard Kramer of Crete Research, LLP."},{"speaker":{"id":"spk07","name":"Operator"},"text":"Operator, + can we move on to the next? Richard. Okay."},{"speaker":{"id":"spk12","name":"Teja + Skala","title":"Director of Investor Relations and Corporate Finance"},"text":"Next + we\u0027ll hear from Jim Suva of Citigroup. Jim, your line is open. If you can + release your mute function, we are unable to hear you."},{"speaker":{"id":"spk06","name":"Jim + Suva","title":"Citigroup Analyst"},"text":"Tim and Luca, you both mentioned + earlier on the Q\u0026A a little bit about India. I was wondering if we\u0027re + now entering a situation of even more opportunity because we\u0027ve exited + COVID, we\u0027ve exited countries with different COVID criteria. We\u0027ve + also seen India build out its higher speed transmissions and your market shares + tremendously underrepresented there. And it appears with the supply chain, you\u0027re + looking at diversifying kind of operational risk, not specific to any country, + but just overall of, you know, now you look at potentially opening up stores + and stuff. Am I right? That that\u0027s the way you look at it is it\u0027s + even more prime for opportunity now than ever. And once you start opening up + stores there, you could just see a complete green shoot of adoptions or any + additional commentary on your view on India as now we\u0027ve navigated COVID + and supply chain and so many challenges over the past two years. Thank you, + gentlemen."},{"speaker":{"id":"spk01","name":"Tim Cook","title":"CEO"},"text":"Yeah, + Jim, we actually did fairly well through COVID in India, and I\u0027m even more + bullish now on the other side of it, or hopefully on the other side of it. And + that\u0027s the reason why we\u0027re investing there with bringing retail there + and bringing the online store there and putting a significant amount of energy + there. I\u0027m very bullish on India."},{"speaker":{"id":"spk06","name":"Jim + Suva","title":"Citigroup Analyst"},"text":"Thank you. And then as my quick follow-up, + you\u0027d mentioned that services, not necessarily specific to India, but services + overall were better than expected. And of course, supply chain was more challenged + than expected. So what was the bridge factor of services being better than expected + on the upside? Was it like advertising or apps or paid monthly subscriptions + or what were kind of the things that really surprised you to the upside on services? + Thank you."},{"speaker":{"id":"spk05","name":"Luca Maestri","title":"CFO"},"text":"It + was primarily, Jim, it\u0027s Luca. It\u0027s primarily this level of engagement + that we saw, which then it reflects into the As you said, the paid subscriptions, + we saw very good results in our cloud services business, in payment services. + Music was very strong. So we had a number of categories that set new records, + all-time records, and they did a bit better than we were expecting at the beginning + of the quarter. And so Tim mentioned it. during, I think, his prepared remarks + that when you look at it in constant currency, we grew services double digits, + and that was on top of a 24% increase a year ago. So it\u0027s very sustained + growth that we\u0027re seeing."},{"speaker":{"id":"spk06","name":"Jim Suva","title":"Citigroup + Analyst"},"text":"Thank you so much, and congratulations to you and all your + teams."},{"speaker":{"id":"spk07","name":"Operator"},"text":"Thanks, Jim. Can + we have the next question, please?"},{"speaker":{"id":"spk12","name":"Teja Skala","title":"Director + of Investor Relations and Corporate Finance"},"text":"Our next question will + come from Chris Sankar of Cowan \u0026 Company."},{"speaker":{"id":"spk09","name":"Chris + Sankar","title":"Cowan \u0026 Company Analyst"},"text":"Yeah, hi. Thanks for + taking my question. I have two of them, too. First one, Tim or Luca, you mentioned + how the macro did soften and had an impact. And as consumers tighten their belts, + when you look across your hardware products and service businesses, where have + you seen the biggest impact and where have you seen the least impact from the + softening macro? And then I had a quick follow-up."},{"speaker":{"id":"spk01","name":"Tim + Cook","title":"CEO"},"text":"We think there were some impact across the products + and in services. Probably the ones that we saw the most impact on were Mac and + wearables. You can see that in those numbers. And probably the least would have + been iPhone."},{"speaker":{"id":"spk09","name":"Chris Sankar","title":"Cowan + \u0026 Company Analyst"},"text":"Got it. Got it. Very helpful, Tim. And then + just a quick follow-up on the MAC. You know, the PC industry is expecting decline + in PC shipments this year also. How to think about the MAC relative to kind + of like where the PC industry as a whole is expecting the shipments to end up? + Is there any color you can give on that? Thank you very much."},{"speaker":{"id":"spk01","name":"Tim + Cook","title":"CEO"},"text":"The industry is very challenged, as you say. The + industry is contracting. I think from us, though, and I don\u0027t know how + this year will play out, so I don\u0027t want to predict the year, but over + the long run, we have a market that is a reasonable-sized market, a big market, + and we have low share. And we have a competitive advantage with Apple Silicon. + And so strategically, I think we\u0027re well positioned in the market, albeit + I think it will be a little rough in the short term."},{"speaker":{"id":"spk09","name":"Chris + Sankar","title":"Cowan \u0026 Company Analyst"},"text":"Thanks a lot, Tim."},{"speaker":{"id":"spk01","name":"Tim + Cook","title":"CEO"},"text":"Yeah."},{"speaker":{"id":"spk07","name":"Operator"},"text":"Thanks, + Krish. A replay of today\u0027s call will be available for two weeks on Apple + Podcasts. as a webcast on apple.com slash investor and via telephone. The number + for the telephone replay is 866-583-1035. Please enter confirmation code 654-1285, + followed by the pound sign. These replays will be available by approximately + 5 p.m. Pacific time today. Members of the press with additional questions can + contact Josh Rosenstock at 408-862-1142. Financial analysts can contact me with + additional questions at 669-227-2402. Thank you again for joining us."}]}' + content_type: application/json + headers: + Accept-Ranges: bytes + Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With, + apikey, x-api-key, x-api-version-schema, x-auth-token, x-auth-type, x-client-build-version, + x-client-commit-id, x-client-device-type, x-behavior-signal, x-request-id + Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS + Access-Control-Allow-Origin: '*' + Access-Control-Expose-Headers: x-trial-calls-remaining, x-trial-expires, x-ratelimit-remaining, + x-api-version-schema, x-request-id, retry-after, x-region, x-fleet + Access-Control-Max-Age: '3600' + Age: '897374' + Cache-Control: public, max-age=300 + Etag: '"f23e55a8ddd15c46a9bb3382317314b6-02649c8a0b659e64-v4"' + Vary: Accept-Encoding, x-api-version-schema + X-Api-Version-Schema: v4 + X-Cache: HIT + X-Cache-Tier: DISK + X-Fleet: atlas + X-Plan-Type: demo + X-Ratelimit-Remaining: '89' + X-Region: US East + X-Request-Id: f390bacf-68c2-4803-8a8a-172aabd37c97 + method: GET + status: 200 + url: https://api.earningscall.dev/transcript?apikey=demo&exchange=NASDAQ&symbol=AAPL&year=2023&quarter=1&level=2 diff --git a/tests/data/aapl-q1-2023-level-3-schema-v4.yaml b/tests/data/aapl-q1-2023-level-3-schema-v4.yaml new file mode 100644 index 0000000..f14a3aa --- /dev/null +++ b/tests/data/aapl-q1-2023-level-3-schema-v4.yaml @@ -0,0 +1,88 @@ +responses: +- response: + auto_calculate_content_length: false + body: '{"exchange":"NASDAQ","symbol":"AAPL","company_name":"Apple Inc.","level":3,"event":{"year":2023,"quarter":1,"conference_date":"2023-02-02T17:00:00-05:00"},"speakers":[{"speaker":{"id":"spk12","name":"Teja + Skala","title":"Director of Investor Relations and Corporate Finance"},"words":["Good","day,","everyone,","and","welcome","to","the","Apple","Q1","Fiscal","Year","2023","Earnings","Conference","Call.","Today\u0027s","call","is","being","recorded.","And","now","at","this","time,","for","opening","remarks","and","introductions,","I","would","like","to","turn","the","call","over","to","Teja","Skala,","Director","of","Investor","Relations","and","Corporate","Finance.","Please","go","ahead."],"start_times":[0.009,0.129,0.269,0.709,0.87,1.19,1.27,1.45,1.83,2.19,2.631,2.6409999999999996,3.031,4.232,4.672,5.312,5.712,6.093,6.273,6.493,6.993,7.674,7.874,7.974,8.174,8.514,8.854,9.235,9.755,9.935,10.595,10.655,10.796,10.916,10.996,11.216,11.316,11.576,11.856,12.096,12.817,13.717,14.238,14.358,14.778,15.618,15.799,16.179,17.159,17.42,17.62]},{"speaker":{"id":"spk07","name":"Operator"},"words":["Thank","you.","Speaking","first","today","is","Apple","CEO","Tim","Cook,","and","he\u0027ll","be","followed","by","CFO","Luca","Maestri.","After","that,","we\u0027ll","open","the","call","to","questions","from","analysts.","Before","turning","the","call","over","to","Tim,","I","would","like","to","remind","everyone","that","the","December","quarter","spanned","14","weeks,","while","the","March","quarter,","as","usual,","has","13","weeks.","Please","note","that","some","of","the","information","you\u0027ll","hear","during","our","discussion","today","will","consist","of","forward-looking","statements","including,","without","limitation,","those","regarding","revenue,","gross","margin,","operating","expenses,","other","income","and","expense,","taxes,","capital","allocation,","and","the","future","business","outlook,","including","the","potential","impact","of","COVID-19","on","the","company\u0027s","business","and","results","of","operations.","These","statements","involve","risks","and","uncertainties","that","may","cause","actual","results","or","trends","to","differ","materially","from","our","forecast.","For","more","information,","please","refer","to","the","risk","factors","discussed","in","Apple\u0027s","most","recently","filed","annual","report","on","Form","10-K","and","the","Form","8-K","filed","with","the","SEC","today,","along","with","the","associated","press","release.","Apple","assumes","no","obligation","to","update","any","forward-looking","statements","or","information","which","speak","as","of","their","respective","dates.","I\u0027d","now","like","to","turn","the","call","over","to","Tim","for","introductory","remarks."],"start_times":[18.7,18.94,19.561,19.961,20.201,20.942,21.102,21.322,21.762,22.022,22.843,22.943,23.123,23.223,23.543,23.743,24.364,24.744,26.405,26.645,27.025,27.226,27.446,27.546,27.806,27.926,28.486,28.706,29.96,30.38,30.621,30.741,31.021,31.201,31.362,32.062,32.122,32.283,32.443,32.563,33.043,33.624,33.784,33.904,34.345,34.725,34.735,35.626,36.247,36.427,36.547,36.848,37.568,37.789,38.369,38.379,38.99,40.131,40.451,40.792,40.972,41.132,41.212,41.312,41.853,42.113,42.594,42.874,42.994,43.475,44.196,44.376,44.756,44.896,45.497,46.118,46.938,47.259,48.38,48.72,49.441,50.482,50.783,51.824,52.244,53.385,53.605,53.866,53.966,54.947,55.848,56.228,57.509,57.629,57.75,58.09,58.47,58.951,59.291,59.411,60.052,60.552,60.692,61.954,62.034,62.174,62.895,63.475,63.615,64.016,64.156,65.537,65.717,66.318,66.738,67.179,67.319,68.32,68.52,68.74,69.261,69.601,70.122,70.282,70.843,70.983,71.263,71.844,72.044,72.184,73.476,73.616,73.836,74.837,75.137,75.437,75.517,75.678,75.918,76.558,77.038,77.259,77.779,78.099,78.56,79.3,79.62,80.281,80.441,80.721,81.822,81.942,82.062,82.382,83.463,83.763,83.883,84.143,84.744,85.484,85.785,85.925,86.025,86.605,86.825,88.266,88.647,89.107,89.347,90.048,90.268,90.748,91.008,91.609,92.269,92.429,93.23,93.47,94.07,94.25,94.371,94.571,95.151,96.252,96.452,96.672,96.852,96.952,97.192,97.293,97.593,97.773,97.893,98.233,98.393,98.874]},{"speaker":{"id":"spk01","name":"Tim + Cook","title":"CEO"},"words":["Thank","you,","Tejas.","Good","afternoon,","everyone,","and","thanks","for","joining","us.","Today","we\u0027re","reporting","revenue","of","$117.2","billion","for","the","December","quarter.","We","set","all-time","revenue","records","in","a","number","of","markets,","including","Canada,","Indonesia,","Mexico,","Spain,","Turkey,","and","Vietnam,","along","with","quarterly","records","in","Brazil","and","India.","As","a","result","of","a","challenging","environment,","our","revenue","was","down","5%","year","over","year.","But","I\u0027m","proud","of","the","way","we","have","navigated","circumstances","seen","and","unforeseen","over","the","past","several","years,","and","I","remain","incredibly","confident","in","our","team,","in","our","mission,","and","in","the","work","we","do","every","day.","Let","me","discuss","the","three","factors","that","impacted","our","revenue","performance","during","the","quarter.","The","first","was","foreign","exchange","headwinds,","which","had","a","nearly","800","basis","point","impact.","On","a","constant","currency","basis,","we","grew","year","over","year","and","would","have","grown","in","the","vast","majority","of","the","markets","we","track.","The","second","factor,","which","we","described","in","a","November","6th","update,","was","COVID-19-related","challenges,","which","significantly","impacted","the","supply","of","iPhone","14","Pro","and","iPhone","14","Pro","Max","and","lasted","through","most","of","December.","Because","of","these","constraints,","we","had","significantly","less","iPhone","14","Pro","and","iPhone","14","Pro","Max","supply","than","we","planned,","causing","ship","times","to","extend","far","beyond","what","we","had","anticipated.","As","we","always","have","every","step","of","the","way","throughout","the","pandemic,","we","continue","to","prioritize","people","and","work","with","our","suppliers","to","ensure","the","health","and","safety","of","every","worker.","Production","is","now","back","where","we","want","it","to","be.","The","third","factor","was","a","challenging","macroeconomic","environment","as","the","world","continues","to","face","unprecedented","circumstances","from","inflation","to","war","in","Eastern","Europe","to","the","enduring","impacts","of","the","pandemic.","And","we","know","that","Apple","is","not","immune","to","it.","But","whatever","conditions","we","face,","our","approach","is","always","the","same.","We","are","thoughtful","and","deliberate.","We","manage","for","the","long","term.","We","adapt","quickly","to","circumstances","outside","our","control","while","delivering","with","excellence","in","the","things","we","can.","We","invest","in","innovation,","in","people,","and","in","the","positive","difference","we","can","make","in","the","world.","And","we","do","it","all","to","provide","our","customers","with","technology","that","will","enrich","their","lives","and","help","unlock","their","full","creative","potential.","It\u0027s","a","wonderful","thing","to","be","a","part","of,","and","it\u0027s","so","rewarding","for","all","of","us","at","Apple","when","we","hear","how","much","our","customers","are","loving","what","we","create.","Let","me","talk","now","about","what","we","saw","across","our","product","categories.","Starting","with","iPhone,","revenue","came","in","at","$65.8","billion","for","the","quarter,","down","8%","year","over","year.","However,","on","a","constant","currency","basis,","iPhone","revenue","was","roughly","flat.","Our","customers","continue","to","rave","about","the","astounding","camera","capabilities","and","unprecedented","battery","life","and","the","groundbreaking","suite","of","health","and","safety","features.","The","iPhone","14","lineup","pushes","the","limits","of","what","users","can","do","with","a","smartphone.","During","the","quarter,","Mac","revenue","came","in","at","$7.7","billion,","which","was","in","line","with","what","we","had","expected.","We","had","a","difficult","compare","because","this","time","last","year","we","had","the","extremely","successful","launch","of","the","redesigned","M1","MacBook","Pros.","We","also","faced","a","challenging","macroeconomic","environment","and","foreign","exchange","headwinds.","We","remain","confident","in","and","focused","on","the","long-term","opportunity","for","Mac.","Just","last","month,","we","introduced","new","MacBook","Pro","models","powered","by","our","latest","developments","in","Apple","silicon,","M2","Pro","and","M2","Max.","These","chips","enable","unprecedented","performance","and","do","so","with","less","energy,","which","is","not","only","good","for","the","environment,","but","gives","the","newest","MacBook","Pro","the","longest","battery","life","ever","in","a","Mac.","We","also","introduced","the","M2-powered","Mac","Mini,","which","will","supercharge","productivity","for","users","of","all","kinds","and","leave","them","stunned","by","just","how","powerful","a","Mac","Mini","can","be.","During","the","quarter,","iPad","revenue","grew","30%","to","a","total","of","$9.4","billion.","The","very","strong","growth","was","due","in","part","to","a","favorable","compare","to","the","December","quarter","a","year","ago","when","we","experienced","significant","supply","constraints.","Customers","continue","to","praise","our","new","lineup","for","its","versatility,","whether","it\u0027s","the","new","iPad","Pro,","now","powered","by","the","M2,","or","the","newly","designed","iPad","10th","generation","with","its","stunning","liquid","retina","display","and","beautiful","colors.","Revenue","for","wearables,","home,","and","accessories","was","$13.5","billion,","which","was","down","8%","year","over","year,","driven","by","foreign","exchange","headwinds","and","a","challenging","macroeconomic","environment.","We","remain","excited","about","the","long-term","opportunity","in","the","category.","As","an","example,","a","few","weeks","ago,","we","announced","the","Next","Generation","HomePod,","which","is","an","indispensable","addition","to","the","smart","home.","This","powerful","smart","speaker","relies","on","advanced","computational","audio","to","produce","an","incredible","listening","experience.","We\u0027re","also","helping","users","make","their","home","safer","with","sound","recognition.","This","feature,","arriving","later","this","spring,","allows","HomePod","to","send","a","notification","directly","to","a","user\u0027s","iPhone","if","a","smoke","or","carbon","monoxide","alarm","sound","is","identified.","We","continue","to","hear","wide","praise","for","Apple","Watch","Series","8","and","Apple","Watch","Ultra,","which","has","set","a","new","standard","for","what\u0027s","possible","with","a","wearable.","From","a","whole","host","of","health","and","safety","features","to","incredible","new","capabilities","for","extreme","athletes,","there","is","something","for","everyone","in","these","amazing","products.","Customers","are","excited","about","some","phenomenal","new","features","we\u0027ve","made","available","across","many","of","our","products","as","well.","One","of","the","highlights","is","emergency","SOS","via","satellite,","which","launched","for","iPhone","14","customers","in","the","US","and","Canada","in","November,","and","for","customers","in","France,","Germany,","Ireland,","and","the","UK","in","December.","This","is","a","feature","we","hope","our","users","will","never","need,","but","it","is","incredibly","heartening","to","get","emails","from","people","describing","the","life-saving","impact","our","new","safety","features","have","had","on","them.","We\u0027re","always","looking","for","new","ways","to","empower","people","to","create","and","collaborate.","In","December,","we","released","Freeform,","a","brand","new","app","that","lets","users","take","their","ideas","wherever","they","want,","anywhere","they","are,","all","while","collaborating","in","real","time.","Freeform","has","already","received","praise","from","reviewers","for","its","flexibility","and","simplicity","as","it","works","seamlessly","across","iPhone,","iPad,","and","Mac.","Today,","we","are","very","excited","to","announce","that","we\u0027ve","achieved","a","truly","incredible","milestone.","Thanks","to","our","deep","commitment","to","innovation,","incredible","customer","loyalty","and","satisfaction,","and","a","large","number","of","switchers,","we","now","have","more","than","2","billion","active","devices","as","part","of","our","growing","installed","base,","double","what","it","was","just","seven","years","ago.","This","is","an","incredible","testament","to","our","products","and","services","and","the","strength","of","our","ecosystem.","We","set","an","all-time","revenue","record","of","$20.8","billion","in","services,","which","was","better","than","what","we","had","expected.","We","achieved","double-digit","revenue","growth","from","App","Store","subscriptions","and","set","all-time","revenue","records","across","a","number","of","categories,","including","cloud","and","payment","services.","All","told,","Apple","now","has","more","than","935","million","paid","subscriptions.","Apple","has","also","just","begun","a","historic","10-year","partnership","with","Major","League","Soccer.","Just","yesterday,","we","launched","MLS","Season","Pass,","which","will","give","fans","in","more","than","100","countries","access","to","every","live","MLS","regular","season","game,","as","well","as","the","playoffs","and","MLS","Cup,","all","with","no","blackouts.","And","while","we\u0027re","providing","more","content","to","sports","fans","than","ever","before,","Apple","TV","Plus","continues","to","showcase","powerful","characters","and","moving","storytelling.","We","were","thrilled","to","celebrate","the","holidays","alongside","our","Apple","TV","Plus","subscribers","with","the","hit","movie","Spirited,","and","we\u0027re","delighted","to","see","how","much","people","are","enjoying","new","and","returning","series","like","Shrinking,","Slow","Horses,","and","Truth","Be","Told.","and","we","have","some","great","upcoming","movies","in","Sharper","and","Tetris,","along","with","Emmy","Award","winner","Ted","Lasso","returning","this","spring.","During","the","quarter,","we","made","some","great","updates","to","Fitness","Plus","as","well,","expanding","our","catalog","of","more","than","3,500","workouts","and","meditations","to","include","a","new","kickboxing","category","and","a","new","sleep","theme","for","meditations.","Our","latest","artist","spotlight","series","features","the","music","of","the","incomparable","Beyonce,","and","we\u0027re","excited","to","take","a","stroll","with","guests","appearing","on","our","fifth","season","of","Time","to","Walk.","And","we","continue","to","build","on","our","decades-long","commitment","to","helping","small","businesses","thrive","when","we","announced","Apple","Business","Connect.","This","new","tool","gives","business","owners","even","more","control","over","how","billions","of","people","see","and","engage","with","their","products","and","services","every","day.","Businesses","of","all","sizes","can","now","customize","key","information","for","users","across","Apple","Maps,","Messages,","Wallet,","Siri,","and","other","apps.","Meanwhile,","in","retail,","we","celebrated","25","years","of","the","Apple","online","store","and","also","opened","Apple","Pacific","Center","in","Vancouver","and","Apple","American","Dream","in","New","Jersey.","And","I\u0027m","grateful","to","all","the","teams","who","helped","our","customers","throughout","the","busy","holiday","season.","At","Apple,","we","spend","a","lot","of","time","focused","on","creating","an","unparalleled","experience","for","our","customers","in","every","product","and","service","that","we","offer.","We\u0027re","also","just","as","dedicated","to","leading","with","our","values","in","everything","we","do.","As","part","of","that","work,","we","strengthened","our","deep","commitment","to","privacy","and","security,","giving","users","three","new","tools","to","protect","their","most","sensitive","data.","iMessage","contact","key","verification,","security","keys","for","Apple","ID,","and","advanced","data","protection","for","iCloud.","At","Apple,","we","feel","a","deep","sense","of","responsibility","to","leave","the","world","better","than","we","found","it.","We\u0027re","also","a","year","closer","to","2030,","and","we","remain","ever","focused","on","the","environmental","commitments","we","set","out","for","the","end","of","the","decade.","As","an","example,","the","latest","Mac","Mini","and","MacBook","Pro","models","all","use","100%","recycled","aluminum","in","the","enclosure","and","recycled","rare","earth","elements","in","all","magnets.","And","in","a","first","for","HomePod,","we\u0027re","using","100%","recycled","gold","in","the","plating","of","multiple","printed","circuit","boards.","In","honor","of","Black","History","Month,","we","released","the","Black","Unity","Collection,","including","the","special","edition","Apple","Watch","Black","Unity","Sport","Loop,","a","new","matching","watch","face,","and","iPhone","wallpaper.","Through","our","racial","equity","and","justice","initiative,","we\u0027re","expanding","our","support","of","five","organizations","focused","on","lifting","up","communities","of","color","through","technology.","And","we","are","committed,","as","ever,","to","building","on","our","progress","around","inclusion","and","diversity.","During","the","quarter,","we","also","announced","that","since","the","inception","of","our","giving","program","11","years","ago,","we\u0027ve","donated","more","than","$880","million","to","humanitarian","efforts,","disaster","relief,","childhood","education,","and","more.","And","over","the","last","16","years","through","our","partnership","with","REDD,","Apple","supported","grants","have","helped","more","than","11","million","people","get","the","care","and","support","services","they","need.","As","we","look","ahead","in","2023,","we","are","excited","about","the","year","to","come.","At","Apple,","we","are","always","looking","forward,","always","focused","on","the","next","challenge,","always","determined","to","do","great","things","with","unmatched","creativity","and","unrivaled","innovation.","And","that","makes","me","more","confident","about","the","future","of","Apple","than","I","have","ever","been.","With","that,","I\u0027ll","turn","it","over","to","Luca."],"start_times":[100.745,100.945,101.085,101.986,102.186,102.687,103.467,103.627,103.908,104.068,104.508,105.909,106.25,106.45,106.99,107.651,107.661,109.332,110.093,110.253,110.353,110.833,112.154,112.355,112.755,113.315,113.716,114.136,114.256,114.396,114.777,114.877,115.697,116.218,117.158,118.299,119.4,120.341,120.882,121.002,121.982,122.283,122.503,123.023,123.544,123.684,124.344,124.585,126.949,127.089,127.169,127.589,127.729,127.829,128.369,129.31,129.45,129.89,130.05,130.06,131.13,131.35,131.55,132.731,132.871,133.031,133.331,133.431,133.551,133.731,133.851,134.071,134.691,135.612,136.032,136.232,137.072,137.252,137.392,137.672,138.032,138.853,138.993,139.113,139.433,140.173,140.733,140.853,141.013,141.793,141.934,142.094,142.834,142.954,143.054,143.194,143.414,143.574,143.894,144.114,145.715,145.855,145.995,146.455,146.615,146.915,147.375,147.555,148.115,148.235,148.616,149.156,149.436,149.556,151.277,151.437,151.838,152.058,152.358,152.839,153.84,154.02,154.181,154.261,154.271,155.242,155.683,156.063,157.665,157.765,157.865,158.286,158.826,159.627,159.828,160.128,160.368,160.589,161.309,161.47,161.77,161.97,162.431,162.531,162.631,162.972,163.532,163.632,163.752,164.173,164.353,166.479,166.639,166.999,167.98,168.2,168.36,168.96,169.08,169.18,169.921,170.181,171.021,171.241,172.622,173.743,173.983,174.903,175.444,175.624,176.404,176.684,176.694,177.625,178.405,178.665,178.67499999999998,179.606,179.886,180.646,180.826,181.306,181.687,182.087,182.207,184.248,184.608,184.708,184.908,185.969,186.109,186.309,187.109,187.57,187.57999999999998,188.41,189.13,189.31,189.32,190.151,190.431,190.731,191.191,191.351,191.532,192.472,192.952,193.232,193.613,193.793,194.273,194.553,194.993,195.173,195.273,195.414,197.805,197.945,198.165,198.565,199.065,199.286,199.566,199.646,199.766,199.966,200.326,200.446,201.466,201.646,202.307,202.447,203.187,204.267,204.407,204.668,204.828,204.988,205.688,205.928,206.388,206.528,206.808,206.948,207.489,207.729,207.969,209.269,209.769,209.889,210.109,210.43,210.61,210.75,210.99,211.11,211.25,213.069,213.189,213.449,213.85,214.05,214.13,214.71,215.671,216.672,216.812,216.932,217.232,217.833,217.993,218.533,219.394,220.795,221.015,221.936,222.096,222.416,222.576,223.056,223.717,223.877,224.017,224.558,225.078,225.158,225.258,226.499,226.619,226.759,226.979,227.24,227.6,227.78,228.08,228.48,228.761,229.441,229.601,230.021,230.602,230.822,231.622,231.762,232.443,232.723,233.163,233.323,234.364,234.524,234.704,235.664,235.824,236.785,236.985,237.385,237.505,237.625,237.945,238.786,238.946,239.306,239.706,239.866,240.667,241.107,241.227,242.168,242.408,242.888,243.248,243.788,243.888,244.028,244.329,244.489,245.769,245.929,246.41,246.59,247.59,247.75,248.411,248.551,248.651,248.811,249.331,249.751,249.891,250.071,250.292,250.392,250.512,251.512,251.632,251.792,251.992,252.213,252.433,252.593,252.933,253.093,253.573,253.753,254.474,254.614,254.834,255.214,255.414,256.315,256.455,256.755,257.135,257.355,257.715,258.156,259.781,259.961,260.061,260.542,260.782,260.882,261.022,261.102,261.523,262.263,262.403,262.543,262.764,263.324,263.644,263.825,263.945,264.125,264.325,264.605,264.785,264.986,265.246,265.406,265.626,265.766,266.267,266.447,266.807,266.967,267.147,269.329,269.469,269.569,269.83,270.23,270.49,270.65,270.811,271.071,271.451,271.611,272.012,273.973,274.354,274.614,275.615,276.035,276.415,276.596,276.606,277.797,278.517,278.657,278.797,279.598,279.608,280.779,281.019,281.22,282.581,283.201,283.321,283.421,283.902,284.422,285.123,285.463,285.884,286.104,286.564,288.058,288.238,288.758,289.299,289.439,289.779,290.059,290.219,290.859,291.28,292.44,292.72,293.641,294.061,294.861,294.981,295.122,295.862,296.342,296.502,296.822,296.962,297.323,298.523,298.683,298.693,299.544,300.064,300.464,300.624,301.024,301.125,301.445,301.765,301.965,302.145,302.325,302.385,304.726,305.026,305.167,306.087,306.367,306.807,307.127,307.268,307.27799999999996,308.348,309.489,309.689,309.889,310.009,310.329,310.529,310.729,310.889,311.069,312.628,312.788,312.969,313.049,313.569,314.21,314.55,314.751,315.051,315.372,315.632,315.792,315.972,316.112,316.673,317.334,318.095,318.195,318.375,319.256,319.677,320.117,321.579,321.72,322.06,322.42,322.521,323.121,324.062,325.044,325.204,325.504,326.045,327.608,327.788,328.168,328.828,329.188,329.348,330.049,330.129,330.269,330.849,331.569,331.749,332.709,332.989,333.31,333.99,334.15,334.69,334.97,335.41,335.71,336.17,336.55,336.71,336.87,337.271,337.851,337.991,338.291,339.311,339.711,340.411,340.711,340.932,342.072,342.312,342.672,343.372,344.252,345.233,345.353,345.593,345.813,346.033,346.473,347.293,347.493,347.613,347.813,348.033,348.253,348.393,348.514,349.474,349.634,349.894,350.094,350.474,350.934,351.354,351.614,352.114,352.515,352.915,353.235,353.335,353.415,354.741,354.881,355.281,355.782,356.022,356.942,357.222,357.923,358.123,358.383,359.123,359.844,360.164,360.524,360.784,361.024,361.905,362.065,362.325,362.605,363.185,363.365,363.625,363.846,364.366,364.446,364.686,364.986,365.166,366.927,367.227,367.367,368.448,368.888,369.348,369.358,369.648,370.849,370.989,371.469,371.479,372.39,373.89,374.031,374.291,374.671,375.071,375.271,375.511,375.731,376.212,376.392,376.492,376.932,377.492,377.612,377.732,378.253,378.733,378.833,379.093,379.873,380.054,380.274,380.974,381.654,382.055,383.973,384.454,384.954,385.114,386.015,386.176,386.376,386.856,387.036,387.197,388.418,388.678,388.838,389.019,389.379,389.78,390.661,390.921,391.301,391.441,391.662,392.643,392.763,392.983,393.384,394.124,394.545,394.845,395.906,396.107,396.287,396.847,397.268,397.608,398.609,398.75,399.21,400.908,401.348,401.528,402.329,402.769,402.909,403.99,404.0,405.251,406.472,406.672,406.832,406.842,407.993,408.253,408.433,409.233,409.594,409.834,410.134,410.574,411.495,411.635,411.775,412.335,413.376,414.997,415.197,415.678,416.318,416.558,416.678,417.219,417.979,418.059,418.199,419.867,420.007,420.107,420.868,420.928,421.128,421.428,422.268,422.448,422.828,423.029,423.289,423.889,424.969,425.17,425.31,425.57,426.57,427.09,427.231,427.371,427.711,428.871,429.091,429.572,429.892,430.412,430.952,431.172,431.613,432.513,433.353,433.533,434.014,434.114,434.994,435.454,437.025,437.185,437.486,437.986,438.346,438.527,438.727,439.087,439.568,439.788,440.128,441.41,441.65,442.511,443.012,443.352,443.512,444.393,444.774,445.334,445.494,445.755,445.835,446.716,447.357,447.557,447.717,448.197,449.058,449.219,449.379,450.2,450.38,450.76,451.441,451.801,452.122,452.262,454.329,454.489,454.969,455.069,455.329,455.649,456.029,456.31,456.59,456.91,456.92,457.87,458.07,458.31,458.71,459.51,459.69,459.87,460.13,460.271,460.511,460.951,461.111,461.391,461.911,462.111,462.171,463.491,463.731,463.831,464.132,464.512,464.652,464.952,465.092,465.492,466.392,466.592,467.452,467.672,468.453,468.653,469.153,469.993,470.193,470.333,470.753,471.173,471.894,472.014,472.274,472.754,474.332,474.792,474.913,475.493,475.793,476.034,476.634,476.834,477.255,477.495,477.715,478.356,478.796,479.056,479.197,479.337,480.037,480.197,481.258,481.379,481.459,481.579,482.159,482.319,483.1,483.541,483.801,485.562,485.843,486.163,486.403,486.413,487.304,487.844,487.945,488.165,488.565,488.725,489.306,489.446,490.527,490.667,490.887,491.488,491.708,492.609,493.55,493.99,494.11,494.35,494.991,495.131,496.823,497.044,497.204,497.304,497.685,497.865,498.126,498.386,498.727,499.008,499.388,500.11,500.41,500.571,500.731,501.473,501.954,502.074,502.394,502.835,503.056,503.417,504.098,504.258,505.1,505.982,506.122,506.302,506.723,507.164,507.365,507.645,507.765,509.11,509.29,509.57,509.911,510.131,510.311,510.631,510.812,511.352,511.692,511.872,512.373,512.493,513.914,514.054,514.815,514.995,515.396,516.477,516.557,516.857,517.197,517.557,517.758,518.078,518.418,518.678,518.899,519.759,520.24,520.44,521.221,521.661,522.021,522.762,522.942,523.182,523.963,524.063,524.323,525.504,526.145,526.545,526.966,527.406,527.827,528.067,528.627,528.787,528.927,529.808,529.928,531.049,531.189,531.29,531.57,532.25,532.831,533.692,534.512,534.653,537.045,537.465,537.625,537.845,538.206,538.726,538.906,539.306,539.446,539.706,540.206,540.347,540.927,541.707,543.188,543.508,543.728,543.928,544.208,544.709,544.869,545.949,546.569,547.05,547.51,547.63,548.91,549.071,549.191,549.571,549.811,549.931,550.891,551.091,551.332,551.572,551.792,551.802,552.492,553.172,553.473,554.113,554.273,554.493,554.633,554.813,555.353,555.894,556.974,557.314,557.474,557.594,557.895,558.115,558.435,558.775,559.935,560.136,560.256,560.376,561.036,561.556,561.676,561.836,562.317,562.477,563.457,563.597,563.737,564.137,564.277,564.478,566.766,566.946,567.186,567.367,567.847,568.287,568.728,568.7379999999999,569.729,570.53,570.71,571.691,571.891,572.131,572.452,572.612,572.792,572.912,573.052,574.473,574.634,575.034,575.715,576.135,576.515,576.856,577.016,577.336,578.477,578.638,579.038,579.598,580.039,580.459,581.02,581.2,581.58,581.7,582.802,583.402,584.003,584.143,584.543,586.005,586.205,587.026,587.306,587.526,587.806,588.067,588.077,588.227,588.547,588.687,592.89,593.15,593.37,593.75,594.05,594.55,594.91,595.511,596.011,597.031,597.251,597.591,597.811,599.071,599.311,599.832,600.012,600.652,601.072,601.472,602.312,602.492,602.672,602.872,603.312,603.432,603.672,603.682,604.713,605.733,606.213,606.553,606.913,607.533,608.414,608.854,609.254,610.074,610.214,610.434,610.554,610.714,611.374,611.674,612.114,613.075,613.335,613.615,613.935,615.632,615.772,615.992,616.212,616.712,616.992,617.552,617.712,618.133,618.493,618.853,619.093,620.333,620.593,620.973,621.373,621.973,622.133,622.854,623.454,624.254,624.454,624.914,626.714,626.854,627.075,627.675,627.855,628.335,628.455,629.075,629.775,630.035,630.315,630.655,630.935,632.096,632.256,632.396,632.616,632.996,634.276,634.396,634.596,635.136,635.356,635.736,635.896,636.157,636.617,636.757,637.297,637.957,638.117,638.677,639.217,639.497,640.397,640.718,641.538,641.698,641.998,642.158,643.703,643.803,643.943,644.123,644.424,644.884,645.405,645.905,646.105,646.606,646.746,647.847,648.287,648.647,648.968,649.308,649.688,649.989,650.869,651.41,651.61,653.612,653.892,654.032,654.853,655.013,655.233,655.534,655.934,656.374,656.515,656.915,657.295,657.455,658.256,658.817,658.977,659.938,660.078,660.298,660.308,661.499,662.26,662.4,663.661,663.841,664.241,664.402,664.662,665.362,666.403,666.564,666.664,666.924,667.284,667.644,667.825,669.597,669.717,670.197,670.478,671.038,671.498,671.919,672.079,672.579,672.699,672.939,673.78,675.081,675.201,675.381,675.921,676.041,676.241,676.321,676.682,676.862,677.662,678.063,678.183,678.363,678.683,679.283,679.443,679.724,679.864,681.636,681.756,681.896,682.436,682.556,682.877,682.997,683.157,683.917,684.477,684.637,685.057,685.398,686.038,686.518,686.718,686.898,687.739,688.059,688.539,689.84,690.08,690.3,690.72,691.0,691.6,692.121,692.461,692.721,693.821,694.081,694.321,694.862,695.002,695.542,696.042,696.182,696.642,696.783,696.983,697.383,697.543,698.283,698.523,699.684,700.244,700.384,700.604,701.164,701.364,701.645,702.385,702.765,703.465,703.806,704.326,704.826,705.106,705.966,706.907,707.767,708.388,708.608,709.008,710.905,711.845,711.985,712.926,713.126,713.136,714.466,714.886,714.986,715.206,715.586,715.987,716.787,717.007,717.587,718.167,718.547,719.148,720.068,720.188,721.148,721.428,721.748,722.249,722.809,722.929,723.069,724.289,724.409,724.569,725.029,725.33,725.53,725.67,726.09,726.25,726.51,726.67,727.21,727.57,727.73,728.05,728.511,730.631,730.811,731.071,731.251,731.552,731.632,731.832,731.972,732.352,732.792,732.972,733.532,733.752,734.672,735.633,735.813,735.953,736.533,736.853,737.133,737.533,737.693,738.134,738.314,738.574,739.738,739.938,740.298,740.598,740.718,741.399,741.599,741.999,742.219,742.379,743.239,743.54,744.02,744.16,745.6,745.761,746.001,746.101,746.321,746.721,746.901,747.441,747.641,747.921,748.422,748.562,749.102,749.242,750.443,750.903,751.323,751.643,751.863,752.223,752.383,752.804,753.004,753.284,753.884,755.145,755.725,756.245,756.525,758.046,758.626,758.986,759.306,759.767,760.627,760.787,761.307,761.627,762.228,762.488,764.716,764.956,765.236,765.456,765.797,765.917,766.277,766.617,766.717,767.717,767.918,768.138,768.278,768.618,768.878,769.038,769.198,769.598,770.599,770.819,771.199,771.279,771.579,772.059,772.069,773.34,773.48,773.64,774.261,774.541,775.401,775.481,775.601,776.281,776.822,777.022,777.322,777.562,777.882,778.102,778.262,778.342,778.462,780.363,780.523,780.643,781.704,781.904,782.344,782.604,783.205,783.365,783.845,784.165,784.865,785.766,785.776,786.406,786.986,787.587,787.687,787.807,788.967,789.107,790.008,790.348,790.708,791.228,791.489,791.669,793.28,793.421,793.561,793.661,794.002,794.182,795.185,795.446,795.456,796.408,797.43,797.872,797.972,798.112,798.593,798.794,799.476,799.856,800.217,802.034,802.214,802.614,802.714,803.034,803.475,804.195,804.395,804.855,804.995,805.395,805.736,806.756,807.256,807.496,808.096,808.917,809.217,809.957,810.357,810.718,811.098,811.838,811.958,812.178,812.618,812.978,813.639,813.899,814.299,815.84,816.12,816.28,816.78,817.14,817.26,817.72,818.601,818.801,819.401,819.561,820.041,820.161,820.561,821.422,821.882,822.082,822.682,822.842,823.423,823.563,823.983,824.263,826.004,826.124,826.284,826.424,827.204,827.524,828.185,828.385,828.805,828.925,829.065,829.825,830.125,830.846,830.946,833.584,833.884,834.024,834.584,834.784,835.145,835.585,835.765,836.065,836.205,836.785,836.905,837.045,837.405,837.415,838.206,838.506,839.386,839.606,840.186,840.386,840.396,842.167,842.987,843.127,844.048,844.848,845.448,846.348,846.909,847.789,847.949,849.009,849.249,849.449,849.59,849.6,850.45,850.87,851.13,851.27,851.87,852.11,853.051,853.351,853.851,854.251,854.451,854.751,855.031,855.0409999999999,855.852,856.312,857.052,857.232,857.392,857.792,857.932,858.373,858.953,859.153,860.939,861.059,861.219,861.479,862.22,862.23,863.921,864.101,864.281,864.962,865.242,865.362,865.642,865.802,867.203,867.463,868.064,868.244,868.604,869.065,869.445,870.626,871.046,871.506,871.606,871.726,872.007,873.267,873.688,874.268,874.408,874.668,875.009,875.409,875.709,876.189,877.09,877.29,877.931,879.532,879.652,879.872,880.172,880.472,880.792,881.493,881.773,881.953,882.434,882.654,883.274,883.494,883.594,883.915,884.135,885.476,885.656,886.116,886.316,886.536,886.676,886.897,887.057]},{"speaker":{"id":"spk05","name":"Luca + Maestri","title":"CFO"},"words":["Thank","you","Tim,","and","good","afternoon","everyone.","As","Tim","mentioned,","revenue","for","the","December","quarter","was","$117.2","billion,","down","5%","from","last","year.","A","number","of","factors","had","a","significant","impact","on","our","results.","First,","we","faced","a","very","difficult","foreign","exchange","environment,","which","affected","our","performance","by","nearly","800","basis","points.","In","other","words,","we","grew","revenue","on","a","constant","currency","basis,","and","in","fact,","we","did","so","in","the","vast","majority","of","markets.","Second,","the","macroeconomic","environment","this","past","quarter","was","markedly","more","challenging","than","12","months","ago.","Third,","we","experienced","significant","supply","shortages","for","iPhone","14","Pro","and","iPhone","14","Pro","Max","in","November","and","through","December.","On","the","other","hand,","we","had","the","positive","impact","of","the","14th","week","in","the","quarter","that","Tejas","mentioned","at","the","beginning","of","the","call.","Products","revenue","was","96.4","billion,","down","8%","from","last","year","due","to","the","factors","I","just","called","out.","At","the","same","time,","however,","our","installed","base","of","active","devices","grew","double","digits","and","achieved","all-time","records","in","each","geographic","segment","and","in","each","major","product","category.","We","are","proud","to","now","have","over","2","billion","active","devices","in","our","installed","base.","This","continued","growth","in","the","installed","base","is","due","to","extremely","strong","levels","of","customer","satisfaction","and","loyalty","and","a","high","number","of","customers","who","are","new","to","our","products.","The","installed","base","growth","also","helped","our","services","set","an","all-time","revenue","record","of","$20.8","billion,","up","6%","over","a","year","ago.","We","achieved","this","new","milestone","despite","more","than","700","basis","points","of","negative","impact","from","foreign","exchange.","We","reached","all-time","services","revenue","records","in","the","Americas,","Europe,","and","rest","of","Asia","Pacific,","and","a","December","quarter","record","in","Greater","China.","We","also","set","records","in","many","services","categories,","including","all-time","revenue","records","for","cloud","services,","payment","services,","and","music,","and","December","quarter","records","for","the","App","Store","and","AppleCare.","Company","gross","margin","was","43%,","up","70","basis","points","from","last","quarter,","due","to","leverage","and","favorable","mix,","partially","offset","by","foreign","exchange.","Products","gross","margin","was","37%,","up","240","basis","points","sequentially,","and","services","gross","margin","was","70.8%,","up","30","basis","points","sequentially,","both","due","to","the","same","factors","that","impacted","total","company","gross","margin.","Operating","expenses","of","14.3","billion","were","significantly","below","the","guidance","range","we","provided","at","the","beginning","of","the","quarter,","and","grew","at","a","slower","pace","than","in","the","past,","as","we","took","actions","to","respond","to","the","current","macro","environment.","Net","income","was","30","billion,","diluted","earnings","per","share","were","$1.88,","and","we","generated","very","strong","operating","cash","flow","of","34","billion.","Let","me","now","get","into","more","detail","for","each","of","our","revenue","categories.","iPhone","revenue","was","$65.8","billion,","despite","significant","foreign","exchange","headwinds,","supply","constraints","on","iPhone","14","Pro","and","iPhone","14","Pro","Max,","and","a","challenging","microeconomic","environment.","In","spite","of","these","circumstances,","we","set","all-time","iPhone","revenue","records","in","Canada,","Italy,","and","Spain,","and","saw","strong","growth","in","several","emerging","markets,","including","all-time","iPhone","revenue","records","for","India","and","Vietnam.","Importantly,","the","installed","base","of","active","iPhones","continues","to","grow","nicely","and","is","at","an","all-time","high","across","all","geographic","segments.","In","emerging","markets","in","particular,","the","installed","base","grew","double","digits,","and","we","had","record","levels","of","switchers","in","India","and","in","Mexico.","Our","customers","continue","to","love","their","experience","with","our","products,","with","the","latest","survey","of","US","consumers","from","451","Research","indicating","customer","satisfaction","of","98%","for","the","iPhone","14","family.","Mac","revenue","was","$7.7","billion,","down","29%","year-over-year","and","in","line","with","our","expectations.","There","were","three","key","drivers","for","our","Mac","results.","First,","we","had","a","challenging","compare","against","last","year\u0027s","launch","of","the","completely","reimagined","MacBook","Pros,","our","first","notebooks","with","M1","Pro","and","M1","Macs.","Second,","we","believe","that","the","macro","environment","impacted","our","Mac","performance.","And","third,","we","faced","significant","foreign","exchange","headwinds.","At","the","same","time,","however,","the","installed","base","of","active","Macs","reached","an","all-time","high","across","all","geographic","segments.","And","we","continue","to","see","very","strong","upgraded","activity","to","Apple","Silicon.","Customer","satisfaction","with","Mac","remains","very","strong","at","96%","based","on","the","latest","survey","of","US","consumers","from","451","research.","iPad","revenue","was","$9.4","billion,","up","30%","year-over-year,","despite","significant","FX","headwinds.","This","performance","was","driven","by","two","key","items.","First,","during","the","December","quarter","a","year","ago,","we","experienced","significant","supply","constraints,","while","this","year","we","had","enough","supply","to","meet","demand.","Second,","we","launched","our","new","iPad","and","the","iPad","Pro","powered","by","the","M2","chip","during","the","quarter.","The","iPad","install","base","reached","a","new","all-time","high","thanks","to","incredible","customer","loyalty","and","a","high","number","of","new","customers.","In","fact,","over","half","of","the","customers","who","purchased","iPads","during","the","quarter","were","new","to","the","product.","Wearables,","home,","and","accessories","revenue","was","$13.5","billion,","down","8%","year","over","year.","The","year-over-year","decline","was","driven","by","significant","FX","headwinds","and","a","challenging","macroeconomic","environment.","However,","our","installed","base","of","devices","in","the","category","set","a","new","all-time","record","thanks","to","the","largest","number","of","customers","new","to","a","smartwatch","that","we\u0027ve","ever","had","in","a","given","quarter.","In","fact,","nearly","two-thirds","of","customers","purchasing","an","Apple","Watch","during","the","quarter","were","new","to","the","product.","Moving","to","services,","we","generated","$20.8","billion","in","revenue,","a","new","all-time","record","in","total","and","for","many","services","offerings,","in","spite","of","a","difficult","foreign","exchange","environment,","and","macroeconomic","headwinds","impacting","certain","categories","such","as","digital","advertising","and","mobile","gaming.","In","constant","currency,","we","grew","services","revenue","double","digits","on","top","of","growing","24%","during","the","December","quarter","a","year","ago.","We","remain","focused","on","the","large","long-term","opportunity","in","this","category,","and","we","continue","to","observe","several","trends","that","reflect","the","strength","of","our","ecosystem.","For","example,","we","saw","increased","customer","engagement","with","our","services","during","the","quarter.","Both","our","transacting","accounts","and","paid","accounts","grew","double","digits","year","over","year,","each","setting","a","new","all-time","record.","Paid","subscriptions","also","continue","to","grow","nicely.","We","now","have","more","than","935","million","paid","subscriptions","across","the","services","on","our","platform,","up","more","than","150","million","during","the","last","12","months","alone,","and","nearly","four","times","what","we","had","just","five","years","ago.","and","we","continue","to","increase","the","reach","and","improve","the","quality","of","our","offerings.","For","instance,","Apple","Pay","is","now","available","to","millions","of","merchants","in","nearly","70","countries","and","regions,","and","we","saw","a","record-breaking","number","of","purchases","made","using","Apple","Pay","globally","during","the","holiday","shopping","season.","Finally,","our","installed","base","of","over","2","billion","active","devices","represents","a","great","foundation","for","future","expansion","of","our","ecosystem.","And","it","continues","to","grow","even","during","difficult","macroeconomic","conditions,","which","speaks","to","the","exceptionally","high","levels","of","customer","loyalty","and","satisfaction","and","our","ability","to","attract","new","customers","to","our","platform.","The","growth","is","coming","from","every","major","product","category","and","geographic","segment,","with","strong","double-digit","increases","in","emerging","markets,","such","as","Brazil,","Mexico,","India,","Indonesia,","Thailand,","and","Vietnam.","Turning","to","the","enterprise","market,","we","are","seeing","continued","adoption","of","our","services","for","business.","like","Apple","Business","Essentials,","AppleCare,","Tap2Pay,","and","Apple","Financial","Services.","For","example,","Mars","Incorporated","has","expanded","its","use","of","AppleCare","for","Enterprise","to","provide","timely","device","support","and","assurance","for","iPads","deployed","across","their","manufacturing","sites.","Meanwhile,","HCA","Healthcare","has","leveraged","Apple","Financial","Services","to","manage","the","annual","refresh","of","its","entire","fleet","of","iPhones.","This","not","only","ensures","that","their","staff","stay","current","on","the","latest","Apple","technology,","but","also","provides","them","with","significant","annual","savings","in","the","process.","Let","me","now","turn","to","our","capital","return","program","and","our","cash","position.","We","returned","over","$25","billion","to","shareholders","during","the","December","quarter","as","our","business","continues","to","generate","very","strong","cash","flow.","This","included","$3.8","billion","in","dividends","and","equivalents","and","$19","billion","through","open","market","repurchases","of","133","million","Apple","shares.","We","ended","the","quarter","with","$165","billion","in","cash","and","marketable","securities.","We","repaid","$1.4","billion","in","maturing","debt","and","decreased","commercial","paper","by","$8.2","billion,","leaving","us","with","total","debt","of","$111","billion.","As","a","result,","net","cash","was","$54","billion","at","the","end","of","the","quarter,","and","we","maintain","our","goal","of","becoming","net","cash","neutral","over","time.","As","we","move","into","the","March","quarter,","I\u0027d","like","to","review","our","outlook,","which","includes","the","types","of","forward-looking","information","that","Tejas","referred","to","at","the","beginning","of","the","call.","Given","the","continued","uncertainty","around","the","world","in","the","near","term,","we","are","not","providing","revenue","guidance,","but","we","are","sharing","some","directional","insights","based","on","the","assumption","that","the","microeconomic","outlook","and","COVID-related","impacts","to","our","business","do","not","worsen","from","what","we","are","projecting","today","for","the","current","quarter.","In","total,","we","expect","our","March","quarter","year-over-year","revenue","performance","to","be","similar","to","the","December","quarter.","This","represents","an","acceleration","in","our","underlying","year-over-year","business","performance","as","the","December","quarter","benefited","from","an","extra","week.","For","an","exchange,","we\u0027ll","continue","to","be","a","headwind,","and","we","expect","a","negative","year-over-year","impact","of","five","percentage","points.","For","services,","we","expect","revenue","to","grow","year-over-year,","while","continuing","to","face","macroeconomic","headwinds","in","areas","such","as","digital","advertising","and","mobile","gaming.","For","iPhone,","we","expect","our","March","quarter","year-over-year","revenue","performance","to","accelerate","relative","to","the","December","quarter","year-over-year","revenue","performance.","For","Mac","and","iPad,","we","expect","revenue","for","both","product","categories","to","decline","double","digits","year-over-year","because","of","challenging","compares","and","macroeconomic","headwinds.","We","expect","gross","margin","to","be","between","43.5%","and","44.5%.","We","expect","OPEX","to","be","between","$13.7","and","$13.9","billion.","We","expect","OINE","to","be","around","negative","$100","million,","excluding","any","potential","impact","from","the","mark-to-market","of","minority","investments,","and","our","tax","rate","to","be","around","16%.","Finally,","today","our","board","of","directors","has","declared","a","cash","dividend","of","23","cents","per","share","of","common","stock,","payable","on","February","16,","2023,","to","shareholders","of","record","as","of","February","13,","2023.","With","that,","let\u0027s","open","the","call","to","questions."],"start_times":[888.729,888.929,889.069,889.709,889.91,890.09,890.49,891.81,891.91,892.11,892.791,893.191,893.311,893.431,893.911,894.792,894.802,896.532,897.413,897.423,897.693,898.593,898.913,900.034,900.114,900.354,900.474,900.974,901.134,901.215,901.835,902.335,902.455,902.595,903.636,904.716,904.896,905.236,905.356,905.636,906.296,906.576,907.057,908.097,908.297,908.717,908.917,909.737,909.937,909.947,911.077,911.458,912.338,912.438,912.658,913.478,913.618,913.938,914.518,914.618,914.718,915.098,915.558,916.359,916.439,916.559,917.419,917.539,917.739,918.099,918.199,918.319,918.599,919.099,919.219,920.98,921.48,921.6,922.26,922.74,922.94,923.22,924.02,924.3,925.041,925.261,925.821,925.831,926.281,926.561,927.844,928.645,928.805,929.585,930.506,930.926,932.007,932.347,932.357,933.128,934.069,934.289,934.299,935.049,935.309,935.87,936.01,936.67,936.791,937.011,938.332,938.412,938.532,938.712,939.372,939.472,939.593,939.693,940.213,940.853,940.974,941.354,941.694,942.074,942.174,942.335,943.255,943.415,943.856,944.496,944.576,944.676,944.997,945.097,945.217,947.469,947.829,948.31,948.3199999999999,949.611,950.632,950.6419999999999,951.613,951.833,952.153,953.174,953.314,953.414,953.514,954.015,954.095,954.335,954.695,955.476,955.556,955.676,955.956,956.557,957.698,957.838,958.278,958.559,958.679,958.979,959.84,960.16,960.52,961.321,961.461,962.022,962.522,963.283,963.403,963.663,964.164,964.984,965.124,965.285,965.665,965.985,966.305,967.426,967.527,967.647,968.607,968.768,968.968,969.268,969.278,969.748,970.329,970.629,971.19,971.33,971.49,971.95,972.964,973.164,973.944,974.485,974.565,974.685,975.085,975.525,975.625,975.805,975.965,976.585,976.885,977.226,977.346,977.726,978.306,978.806,979.966,980.087,980.167,980.407,980.687,980.807,981.607,981.687,981.847,982.107,982.287,982.487,984.828,984.948,985.308,985.568,986.029,986.369,986.809,987.029,988.129,988.329,988.489,989.07,989.51,989.95,989.96,991.21,991.911,991.9209999999999,992.911,993.111,993.191,993.411,994.812,994.972,995.332,995.512,995.692,996.272,996.752,996.912,996.922,997.653,998.013,998.453,998.633,999.193,999.914,1000.114,1000.414,1001.909,1002.049,1002.449,1003.53,1004.03,1004.431,1004.871,1004.951,1005.091,1006.112,1006.772,1006.912,1007.132,1007.232,1007.453,1008.313,1008.433,1008.513,1009.014,1009.374,1009.734,1009.834,1010.154,1011.355,1011.515,1011.795,1012.056,1012.576,1012.776,1013.156,1013.637,1014.457,1015.017,1015.498,1015.898,1016.578,1016.739,1017.059,1018.039,1018.44,1018.96,1019.06,1020.261,1020.401,1020.841,1021.201,1021.582,1021.742,1022.022,1022.182,1022.682,1022.822,1024.67,1025.03,1025.27,1025.65,1025.66,1025.95,1025.96,1028.291,1028.631,1028.871,1029.051,1029.272,1030.132,1030.312,1030.452,1031.072,1031.232,1031.792,1032.413,1033.153,1033.533,1033.693,1033.973,1035.554,1035.974,1036.234,1036.794,1036.804,1038.735,1038.745,1039.875,1040.275,1040.555,1041.736,1041.896,1042.316,1042.576,1043.096,1043.106,1043.756,1043.766,1046.277,1046.597,1046.857,1048.138,1048.458,1048.638,1048.738,1048.838,1049.078,1049.618,1049.838,1050.639,1050.939,1051.299,1051.559,1054.167,1054.607,1055.327,1055.337,1056.308,1056.808,1057.068,1057.868,1058.228,1058.368,1058.909,1059.649,1059.809,1060.269,1060.369,1060.529,1060.909,1061.009,1061.129,1062.35,1062.47,1062.79,1062.91,1062.99,1063.35,1063.61,1063.77,1063.85,1063.97,1064.87,1064.99,1065.11,1065.451,1066.151,1066.271,1066.611,1066.731,1066.851,1067.311,1067.951,1069.972,1070.152,1070.412,1070.422,1070.872,1071.873,1072.273,1072.693,1072.873,1073.253,1073.263,1073.513,1076.094,1076.234,1076.774,1077.034,1077.454,1077.914,1078.235,1078.615,1078.625,1078.755,1082.145,1082.285,1082.385,1082.545,1082.725,1082.945,1083.165,1083.766,1084.046,1084.446,1084.586,1084.746,1085.066,1086.286,1086.566,1086.926,1086.936,1088.067,1088.807,1089.247,1089.767,1090.027,1090.488,1091.268,1091.648,1092.468,1092.748,1092.758,1093.729,1094.129,1094.269,1094.279,1094.909,1095.109,1096.329,1096.449,1096.529,1096.97,1097.65,1098.63,1098.71,1098.97,1099.071,1099.231,1100.552,1100.712,1100.932,1101.633,1101.973,1102.353,1102.734,1102.854,1103.454,1103.795,1103.935,1104.956,1105.116,1105.776,1106.737,1107.258,1107.538,1107.918,1108.339,1109.019,1109.5,1110.601,1111.301,1111.682,1112.202,1112.542,1113.003,1113.103,1114.584,1115.225,1115.625,1116.025,1116.266,1116.406,1116.906,1117.747,1118.167,1118.287,1118.507,1119.849,1120.009,1120.569,1120.709,1120.93,1121.39,1121.85,1122.311,1122.451,1122.931,1124.318,1124.418,1124.799,1125.259,1125.399,1126.58,1126.681,1127.081,1127.501,1127.782,1128.162,1129.063,1129.203,1129.343,1129.784,1130.124,1130.485,1130.605,1131.225,1131.365,1132.066,1132.166,1132.306,1134.148,1134.309,1134.769,1135.149,1135.29,1135.53,1135.75,1136.331,1136.511,1136.671,1137.192,1137.332,1137.452,1137.832,1138.693,1138.873,1139.074,1139.774,1139.7839999999999,1140.855,1141.877,1142.417,1142.818,1143.438,1143.448,1143.618,1143.839,1144.079,1144.089,1144.459,1148.604,1148.864,1149.244,1149.254,1150.145,1150.925,1150.935,1152.426,1153.167,1153.307,1153.387,1153.587,1153.747,1153.907,1155.528,1155.688,1155.828,1156.068,1156.268,1156.849,1157.029,1157.229,1157.709,1158.57,1159.51,1159.67,1160.051,1160.231,1160.731,1161.792,1162.112,1162.412,1162.772,1163.232,1163.352,1163.493,1164.053,1165.394,1165.814,1166.334,1166.514,1166.874,1167.415,1167.935,1168.215,1168.675,1168.876,1169.116,1171.149,1171.569,1171.709,1171.929,1172.07,1172.19,1172.53,1173.15,1174.231,1174.371,1174.611,1175.251,1175.411,1176.212,1176.372,1176.812,1177.493,1177.793,1178.353,1179.434,1179.514,1179.654,1179.914,1180.634,1181.875,1181.995,1182.335,1182.575,1182.716,1183.076,1184.016,1184.256,1184.356,1184.757,1185.217,1185.677,1185.797,1186.298,1187.178,1187.298,1187.418,1187.838,1187.979,1188.379,1188.719,1189.259,1189.78,1190.36,1190.64,1190.98,1192.521,1192.922,1193.522,1193.743,1194.123,1194.503,1194.784,1195.244,1195.254,1197.306,1197.567,1197.667,1197.807,1198.207,1199.329,1199.509,1199.709,1200.33,1200.34,1200.89,1204.079,1204.339,1204.72,1204.73,1205.48,1206.241,1206.251,1207.101,1208.082,1208.562,1209.443,1209.743,1210.904,1211.084,1211.585,1211.745,1212.045,1212.225,1212.425,1212.746,1213.626,1214.387,1214.647,1214.767,1215.187,1215.548,1215.628,1215.848,1216.488,1216.649,1217.189,1217.809,1218.15,1219.13,1219.351,1219.591,1220.171,1220.291,1220.431,1220.652,1221.032,1221.172,1221.372,1222.633,1223.133,1223.273,1223.674,1223.894,1224.254,1225.255,1225.395,1225.675,1226.076,1226.556,1226.976,1227.136,1227.417,1227.817,1228.357,1228.618,1228.738,1231.172,1231.392,1231.652,1232.112,1232.713,1232.953,1233.033,1233.253,1233.613,1234.273,1234.493,1234.633,1235.154,1235.654,1236.274,1236.394,1236.494,1236.814,1237.435,1237.575,1237.935,1238.935,1239.075,1239.555,1239.776,1240.416,1240.496,1240.616,1241.056,1241.196,1241.716,1242.117,1242.377,1242.497,1243.357,1243.537,1243.697,1243.797,1243.937,1246.238,1246.819,1247.179,1247.319,1248.539,1249.059,1249.069,1249.34,1249.92,1249.93,1250.1,1250.22,1250.4,1253.646,1253.766,1254.306,1254.847,1255.027,1255.387,1255.587,1256.307,1256.647,1257.268,1257.388,1257.488,1258.428,1259.168,1260.089,1260.949,1261.109,1261.449,1261.669,1261.769,1262.25,1262.35,1262.45,1263.01,1263.19,1263.29,1263.47,1263.83,1264.671,1264.911,1265.051,1265.211,1265.711,1265.991,1266.131,1266.952,1267.172,1267.312,1267.372,1268.552,1268.692,1268.873,1269.073,1269.493,1269.593,1269.653,1269.913,1271.033,1271.174,1271.654,1271.954,1272.494,1272.614,1273.094,1273.575,1273.695,1273.955,1274.215,1274.455,1274.595,1275.295,1275.455,1275.615,1275.715,1275.836,1277.436,1277.696,1277.836,1278.857,1278.977,1278.987,1280.297,1280.618,1280.758,1281.741,1281.841,1281.981,1282.722,1283.102,1283.262,1283.922,1284.042,1284.202,1284.443,1284.983,1285.483,1285.583,1285.843,1285.963,1286.043,1286.444,1286.724,1287.144,1288.445,1288.565,1289.205,1289.846,1290.586,1290.946,1291.767,1292.027,1292.267,1292.687,1293.548,1293.648,1294.068,1295.389,1295.489,1295.869,1296.449,1296.609,1296.909,1297.41,1297.91,1298.27,1298.871,1299.011,1299.231,1299.331,1299.341,1301.272,1301.532,1301.652,1302.072,1302.633,1302.713,1302.953,1305.131,1305.251,1305.591,1306.172,1306.272,1306.392,1306.812,1307.333,1307.933,1308.013,1308.234,1308.874,1308.994,1309.114,1309.575,1309.695,1310.355,1310.816,1311.797,1311.957,1312.497,1312.637,1313.438,1313.578,1313.778,1314.979,1315.159,1316.18,1316.28,1316.461,1316.801,1317.221,1317.742,1317.922,1318.122,1318.642,1318.903,1319.023,1320.084,1320.484,1320.704,1321.425,1321.985,1322.185,1322.506,1323.406,1323.627,1324.007,1324.567,1324.787,1324.968,1325.568,1325.828,1326.489,1326.589,1326.749,1327.149,1328.476,1328.716,1329.797,1330.037,1330.377,1330.477,1330.717,1331.737,1331.877,1332.057,1332.258,1332.438,1332.448,1334.258,1334.639,1334.879,1335.699,1335.979,1336.119,1336.619,1336.739,1336.919,1338.02,1338.18,1338.34,1338.35,1339.501,1340.121,1340.381,1340.481,1340.491,1340.901,1341.201,1342.042,1342.142,1342.502,1342.802,1343.822,1344.002,1344.122,1344.323,1344.603,1344.843,1345.123,1347.315,1347.435,1347.555,1347.896,1347.976,1348.296,1348.476,1348.977,1349.077,1349.357,1349.477,1349.897,1350.038,1350.198,1351.319,1351.519,1352.019,1352.32,1353.221,1353.321,1353.501,1353.941,1354.181,1354.682,1354.802,1355.443,1355.563,1355.573,1356.464,1357.124,1357.284,1358.586,1358.686,1358.806,1359.006,1359.106,1359.947,1360.207,1360.307,1361.188,1361.568,1361.969,1362.269,1362.529,1363.53,1363.79,1363.911,1364.311,1364.751,1366.488,1367.029,1367.169,1367.489,1367.749,1367.99,1368.0,1368.41,1368.81,1369.111,1370.272,1370.793,1370.933,1371.253,1371.974,1372.134,1372.454,1372.935,1373.075,1373.255,1374.636,1374.737,1374.817,1375.197,1375.317,1375.718,1375.938,1376.318,1377.039,1377.68,1378.801,1379.041,1379.802,1379.942,1380.082,1380.843,1381.063,1381.503,1381.644,1382.104,1382.505,1382.625,1383.846,1384.026,1384.246,1384.707,1384.847,1385.207,1385.407,1385.968,1386.148,1386.248,1388.137,1388.237,1388.497,1388.617,1388.917,1389.237,1389.578,1389.918,1390.198,1390.698,1390.778,1391.238,1392.238,1392.439,1392.839,1393.439,1394.079,1394.179,1394.619,1395.22,1395.46,1395.8,1396.32,1397.16,1397.48,1398.201,1398.941,1399.041,1402.082,1402.382,1402.522,1402.722,1403.262,1404.103,1404.203,1404.283,1404.503,1405.063,1405.963,1406.103,1406.303,1406.744,1406.944,1408.075,1408.435,1408.696,1409.096,1409.897,1410.837,1411.958,1412.078,1412.319,1412.779,1413.98,1414.14,1415.401,1415.661,1416.602,1416.782,1417.403,1417.683,1417.983,1418.263,1418.804,1418.984,1420.185,1420.345,1420.845,1421.266,1421.646,1422.247,1422.407,1423.027,1423.367,1423.788,1424.408,1424.729,1424.889,1425.569,1426.832,1427.292,1428.772,1430.013,1430.193,1430.673,1430.893,1431.353,1432.273,1432.453,1432.833,1433.114,1433.474,1434.354,1434.454,1434.654,1435.154,1435.634,1435.874,1437.135,1437.315,1437.515,1437.755,1438.215,1438.375,1438.655,1439.095,1439.455,1440.575,1440.675,1440.775,1441.115,1441.336,1442.456,1442.596,1442.836,1443.236,1443.436,1443.876,1444.756,1445.036,1445.417,1445.517,1445.617,1447.877,1447.997,1448.097,1448.277,1448.517,1448.677,1448.857,1449.217,1449.518,1450.058,1450.178,1450.338,1450.638,1452.079,1452.199,1452.579,1452.589,1453.18,1453.48,1453.6,1454.501,1454.721,1454.841,1455.221,1455.942,1456.082,1456.222,1456.602,1457.203,1457.383,1458.064,1458.424,1458.924,1459.265,1461.126,1461.306,1461.316,1462.207,1462.547,1462.667,1463.127,1463.248,1464.168,1464.1779999999999,1464.849,1465.449,1465.709,1465.95,1466.27,1467.471,1467.481,1467.571,1467.771,1467.951,1471.721,1471.881,1472.101,1472.221,1472.601,1472.611,1473.722,1474.022,1474.162,1474.743,1474.883,1475.403,1476.543,1476.724,1476.734,1477.964,1478.444,1478.544,1479.065,1479.925,1480.045,1480.385,1480.826,1481.366,1481.376,1482.226,1483.347,1483.687,1483.987,1484.247,1484.568,1484.968,1484.978,1486.228,1487.009,1487.149,1487.209,1488.149,1488.309,1488.59,1488.6,1489.35,1489.97,1490.05,1490.19,1490.29,1490.37,1490.491,1491.191,1491.311,1491.451,1491.891,1492.111,1492.832,1492.952,1493.412,1493.632,1493.972,1494.593,1494.793,1496.946,1497.046,1497.186,1497.386,1497.627,1497.767,1498.107,1498.487,1499.028,1499.208,1499.328,1499.748,1500.089,1500.769,1500.969,1501.27,1501.39,1501.67,1501.81,1502.431,1503.612,1503.772,1504.152,1504.552,1504.893,1504.993,1505.093,1505.393,1505.493,1505.593,1507.335,1507.555,1507.675,1508.075,1508.676,1508.916,1509.016,1509.256,1509.357,1509.477,1509.717,1510.397,1510.498,1510.638,1510.798,1511.478,1511.879,1512.84,1512.98,1513.12,1513.24,1513.64,1513.82,1514.501,1515.602,1515.842,1515.942,1516.042,1516.723,1516.883,1517.003,1517.884,1518.644,1518.825,1519.885,1520.206,1520.406,1520.586,1521.527,1521.647,1521.827,1522.968,1523.128,1523.288,1523.388,1523.489,1523.949,1524.269,1524.409,1524.509,1524.83,1526.502,1526.662,1527.683,1527.843,1528.363,1528.583,1529.063,1529.504,1530.284,1530.664,1531.225,1531.345,1531.505,1531.845,1531.945,1532.045,1532.465,1533.366,1533.566,1534.086,1534.186,1535.567,1535.687,1535.967,1536.507,1537.048,1537.428,1538.508,1538.649,1538.789,1539.269,1539.769,1540.389,1540.59,1540.71,1541.09,1542.05,1542.25,1542.371,1543.151,1543.351,1543.671,1543.771,1543.951,1544.051,1545.032,1545.152,1545.352,1545.972,1546.093,1546.633,1547.433,1548.014,1548.194,1548.514,1549.054,1550.875,1551.055,1552.256,1552.376,1552.676,1553.056,1553.156,1553.416,1555.37,1555.55,1555.95,1556.09,1556.431,1557.111,1557.731,1557.892,1558.192,1558.452,1558.732,1559.132,1559.953,1560.053,1560.393,1561.694,1561.934,1562.254,1562.374,1562.715,1562.895,1563.155,1563.515,1564.095,1564.456,1565.016,1565.176,1566.497,1566.857,1566.957,1567.077,1567.578,1568.058,1568.638,1568.978,1570.259,1570.419,1570.619,1570.82,1571.5,1571.64,1571.96,1572.321,1572.501,1572.801,1573.121,1573.801,1573.922,1574.262,1574.562,1575.102,1576.363,1576.663,1576.863,1577.364,1578.084,1578.224,1578.945,1580.964,1581.104,1581.364,1581.645,1582.165,1582.305,1582.445,1582.455,1584.987,1584.997,1587.549,1587.689,1588.21,1588.93,1589.05,1589.19,1589.2,1590.912,1590.922,1592.033,1593.614,1593.734,1594.234,1594.835,1594.995,1595.956,1596.336,1596.346,1597.317,1597.817,1598.277,1598.438,1599.118,1600.179,1600.379,1600.559,1601.3,1601.42,1601.82,1603.241,1603.361,1603.521,1603.802,1604.042,1604.162,1604.282,1604.292,1606.946,1607.366,1607.646,1607.826,1608.046,1608.127,1608.607,1608.747,1609.087,1609.167,1609.507,1609.987,1609.997,1610.608,1610.908,1611.088,1611.308,1611.388,1611.688,1612.668,1613.069,1613.189,1613.199,1613.199,1614.289,1614.449,1615.97,1616.09,1616.47,1616.61,1616.71,1616.72,1616.72,1619.551,1619.712,1620.212,1620.432,1620.612,1620.712,1620.912,1621.052]},{"speaker":{"id":"spk07","name":"Operator"},"words":["Thank","you,","Luca.","We","ask","that","you","limit","yourself","to","two","questions.","Operator,","may","we","have","the","first","question,","please?"],"start_times":[1623.613,1623.773,1623.893,1624.834,1625.014,1625.194,1625.314,1625.454,1625.694,1626.054,1626.174,1626.374,1627.515,1628.035,1628.175,1628.275,1628.435,1628.535,1628.755,1629.136]},{"speaker":{"id":"spk12","name":"Teja + Skala","title":"Director of Investor Relations and Corporate Finance"},"words":["Certainly.","We","will","go","ahead","and","take","our","first","question","from","David","Bott","with","UBS."],"start_times":[1634.278,1635.455,1635.535,1635.695,1635.775,1635.955,1636.035,1636.236,1636.336,1636.596,1637.257,1637.657,1637.997,1638.518,1638.858]},{"speaker":{"id":"spk10","name":"David + Bott","title":"UBS Analyst"},"words":["Great.","Thanks,","guys,","for","taking","my","question.","So,","Tim,","and","maybe","this","is","for","Luca","as","well,","you","talked","about","the","supply","chain","returning","back","to","normal","after","a","very","difficult","October-November,","but","we\u0027re","still","seeing","some","disruptions","across","tech","products,","whether","it\u0027s","enterprise","or","consumer-facing.","How","do","you","think","about","your","supply","chain","and","maybe","the","levels","of","inventory","or","bills","that","you","might","need","as","we","go","forward","to","sort","of","insulate","your","business","from","these","sort","of","episodic","disruptions?","Have","you","changed","your","view?","And","if","so,","how","does","that","affect","ultimately","margins","and","sort","of","your","balance","sheet","and","cash","flow","items","going","forward?","Thanks."],"start_times":[1641.32,1641.64,1641.88,1642.241,1642.741,1643.181,1643.342,1643.742,1644.643,1645.223,1645.343,1645.563,1645.703,1645.804,1645.924,1646.124,1646.264,1646.424,1646.544,1646.744,1646.924,1647.025,1647.325,1647.705,1648.125,1648.306,1648.426,1648.766,1649.006,1649.066,1649.246,1649.707,1651.388,1651.528,1651.668,1651.849,1652.049,1652.209,1652.809,1653.19,1653.43,1654.11,1654.371,1654.471,1654.911,1655.011,1656.676,1656.776,1656.836,1656.916,1657.076,1657.256,1657.416,1657.817,1658.137,1658.237,1658.517,1658.637,1658.977,1659.117,1659.758,1659.918,1660.238,1660.358,1660.498,1660.718,1660.999,1661.099,1661.219,1661.399,1661.759,1661.879,1662.079,1662.219,1662.8,1663.06,1663.98,1664.16,1664.28,1664.441,1664.561,1665.041,1665.681,1665.801,1665.941,1666.262,1666.462,1667.642,1668.043,1668.183,1668.523,1668.643,1668.763,1668.923,1669.804,1670.364,1670.964,1671.205,1671.385,1671.465,1671.605,1671.905,1672.045,1672.125,1672.325,1672.485,1672.785,1673.026,1673.326]},{"speaker":{"id":"spk01","name":"Tim + Cook","title":"CEO"},"words":["This","is","Tim,","David.","From","a","supply","point","of","view,","we","did","see","disruption","from","early","November","through","most","of","December.","And","from","a","supply","chain","point","of","view,","We\u0027re","now","at","a","point","where","production","is","what","we","need","it","to","be,","and","so","the","problem","is","behind","us.","In","terms","of","going","forward","in","the","supply","chain,","we","build","our","products","everywhere.","There","are","component","parts","coming","from","many","different","countries","in","the","world","and","the","final","assembly","coming","from","from","three","countries","in","the","world","on","just","iPhone.","And","so","we","continue","to","optimize","it.","We\u0027ll","continue","to","optimize","it","over","time","and","change","it","to","continue","to","improve.","I","think","when","you","sort","of","zoom","out","and","back","up","from","it,","the","last","three","years","have","been","a","pretty","difficult","time","between","COVID","and","silicon","shortages","and","the","like,","and","I","think","we","have","had","a","very","resilient","supply","chain","in","the","aggregate.","In","terms","of","supply","for","this","quarter,","which","I","think","was","one","of","your","points,","I","think","we\u0027re","in","decent","supply","on","most","products","for","the","quarter","currently."],"start_times":[1676.44,1676.66,1676.8,1677.181,1678.261,1678.521,1678.641,1679.062,1679.282,1679.362,1679.802,1680.342,1680.643,1680.943,1681.743,1682.964,1683.244,1684.044,1684.505,1684.605,1685.045,1685.285,1686.566,1686.906,1686.946,1687.486,1687.686,1688.067,1688.127,1698.188,1698.428,1698.628,1698.728,1698.828,1699.269,1700.769,1701.47,1701.67,1701.83,1701.97,1702.17,1702.27,1702.39,1702.85,1703.01,1703.711,1703.871,1704.271,1704.451,1704.891,1706.832,1706.952,1707.432,1707.933,1708.313,1708.873,1709.053,1709.373,1709.834,1711.014,1711.514,1711.774,1711.914,1712.435,1712.955,1715.096,1715.556,1716.016,1716.337,1716.717,1716.977,1717.197,1717.497,1717.977,1718.057,1718.197,1718.758,1718.878,1719.118,1719.438,1719.958,1720.378,1721.892,1722.092,1722.432,1722.973,1723.073,1723.193,1723.614,1724.394,1724.754,1727.197,1727.377,1727.777,1727.937,1728.338,1728.458,1729.078,1729.198,1729.499,1729.919,1730.039,1730.579,1730.72,1730.92,1733.542,1734.022,1734.443,1734.883,1735.384,1735.804,1735.964,1737.697,1737.817,1738.057,1738.237,1738.597,1738.857,1738.937,1739.378,1739.658,1740.038,1740.338,1740.498,1740.838,1741.618,1741.798,1742.899,1743.179,1743.459,1743.859,1744.219,1744.859,1745.179,1745.78,1746.22,1747.52,1748.36,1748.661,1749.121,1751.201,1751.401,1751.581,1751.982,1752.102,1752.522,1754.042,1754.222,1754.442,1754.622,1754.702,1754.963,1757.083,1757.484,1757.924,1758.104,1759.004,1759.985,1760.105,1760.505,1761.406,1762.086,1762.446,1762.747,1763.327,1763.527,1763.867,1764.087,1764.287,1764.407,1765.448,1765.688,1767.989,1769.11,1769.35,1769.71,1770.631,1771.011,1771.811,1772.032,1772.612,1774.953,1775.193,1775.333,1776.894]},{"speaker":{"id":"spk13","name":"Harsh + Kumar","title":"Piper Sandler Analyst"},"words":["Great,","thank","you."],"start_times":[1780.796,1781.037,1781.217]},{"speaker":{"id":"spk01","name":"Tim + Cook","title":"CEO"},"words":["Yeah."],"start_times":[1781.557]},{"speaker":{"id":"spk07","name":"Operator"},"words":["Great.","Thanks.","Can","we","have","the","next","question,","please?"],"start_times":[1787.108,1787.528,1787.869,1788.009,1788.069,1788.169,1788.269,1788.409,1788.709]},{"speaker":{"id":"spk12","name":"Teja + Skala","title":"Director of Investor Relations and Corporate Finance"},"words":["Our","next","question","is","from","Shannon","Cross","of","Credit","Suisse."],"start_times":[1791.652,1791.832,1792.092,1792.853,1793.093,1793.773,1794.174,1794.734,1794.934,1795.294]},{"speaker":{"id":"spk11","name":"Shannon + Cross","title":"Credit Suisse Analyst"},"words":["Thank","you","very","much.","Luca,","I","wanted","to","dig","a","bit","more","into","the","commentary","on","gross","margin.","The","guidance,","especially","43.5","to","44.5","is","obviously","quite","strong.","So","I\u0027m","wondering","what\u0027s","helping","you","out","there?","some","mix","and","some","other","things.","And","then,","you","know,","how","should","we","think","about","what","currency","and","hedging","is","going","to","do","as","we","look","forward?","And","then","I","have","a","follow-up."],"start_times":[1797.616,1797.816,1797.977,1798.177,1798.397,1798.917,1799.017,1799.278,1799.398,1799.578,1799.638,1799.838,1800.158,1800.398,1800.499,1801.459,1801.739,1802.16,1802.7,1804.281,1804.742,1804.752,1805.623,1805.633,1807.424,1807.764,1808.425,1808.745,1809.686,1809.826,1809.946,1810.326,1811.147,1811.587,1811.827,1812.048,1813.081,1813.301,1813.661,1813.782,1813.922,1814.162,1814.602,1814.742,1815.182,1815.303,1815.623,1815.883,1816.403,1816.543,1816.784,1818.004,1818.225,1818.725,1818.885,1819.205,1819.305,1819.465,1819.545,1820.006,1820.126,1820.306,1820.506,1820.826,1820.906,1821.006,1821.046,1821.247,1821.287]},{"speaker":{"id":"spk05","name":"Luca + Maestri","title":"CFO"},"words":["Shannon?","Yes,","I","mean,","we\u0027ve","had","good","margin","for","the","December","quarter","to","start","with.","We","reported","43%.","Obviously,","in","December,","we","have","the","benefit","of","leverage","because","of","the","seasonality","of","the","business.","But","we","also","had","favorable","mix","across","the","board.","Of","course,","foreign","exchange","is","an","issue","right","now.","In","the","December","quarter,","on","a","sequential","basis,","foreign","exchange","was","a","negative","110","basis","points","for","us.","And","on","a","year-over-year","basis,","it\u0027s","300","basis","points.","So","obviously,","the","FX","environment","has","changed","a","lot","during","the","last","12","months.","For","March,","yeah,","we\u0027ve","seen","a","margin","expansion,","43.5%","to","44.5%.","We\u0027re","doing","a","lot","of","work","around","cost,","of","course,","you","know,","mix","will","continue","to","help","both","within","categories","and","services","mix","as","we","move","away","from","the","holiday","season.","But","we\u0027re","doing","a","lot","of","work","on","the","cost","structure,","and","that","is","paying","off.","Foreign","exchange","is","still","a","negative,","about","50","basis","points","sequentially,","but","it\u0027s","mitigating.","The","last","couple","of","weeks,","the","dollar","has","weakened","a","bit.","And","so","hopefully,","as","we","go","through","the","year,","hopefully","things","will","improve.","But","for","now,","as","you","correctly","state,","we","are","in","a","good","position","on","margins."],"start_times":[1824.189,1824.929,1825.109,1825.169,1825.309,1825.489,1825.649,1825.87,1826.39,1826.63,1826.97,1827.411,1827.711,1827.851,1828.131,1828.411,1828.672,1828.682,1831.533,1831.994,1832.094,1832.574,1832.734,1832.914,1833.054,1833.575,1834.115,1834.996,1835.276,1835.356,1835.476,1836.096,1836.177,1836.297,1837.397,1837.537,1837.658,1837.938,1838.198,1838.798,1839.459,1840.339,1840.459,1841.636,1841.776,1842.036,1842.336,1843.717,1844.297,1844.517,1844.917,1845.177,1847.718,1847.818,1847.938,1848.399,1849.619,1849.699,1849.799,1850.359,1850.82,1851.16,1851.62,1851.8,1851.9,1851.91,1853.321,1853.761,1854.141,1854.441,1855.381,1855.541,1855.642,1855.702,1856.242,1856.682,1856.692,1857.542,1857.902,1858.223,1858.463,1859.663,1859.903,1860.163,1860.583,1860.744,1861.044,1861.124,1861.304,1861.544,1861.644,1861.654,1862.144,1863.325,1863.845,1864.665,1864.885,1865.045,1865.365,1865.825,1866.206,1866.216,1867.606,1867.616,1870.427,1870.567,1870.727,1870.807,1870.968,1871.068,1871.328,1871.648,1872.689,1872.829,1873.069,1873.189,1874.19,1874.491,1874.691,1875.011,1875.171,1876.132,1876.672,1877.033,1877.994,1878.254,1878.814,1879.815,1879.955,1880.416,1880.656,1880.876,1881.056,1881.156,1881.517,1882.977,1883.077,1883.197,1883.377,1883.417,1883.558,1883.638,1883.838,1883.918,1884.038,1884.278,1885.178,1885.919,1886.099,1886.219,1886.639,1887.36,1887.66,1888.54,1888.68,1888.96,1889.06,1890.061,1890.071,1890.661,1891.021,1891.342,1892.542,1892.682,1892.822,1894.563,1894.703,1895.224,1895.484,1895.564,1895.824,1895.984,1896.404,1896.564,1896.945,1897.025,1897.305,1897.425,1898.085,1899.406,1899.506,1899.626,1899.766,1899.986,1900.146,1900.827,1901.127,1901.847,1902.067,1902.508,1903.048,1903.268,1904.048,1904.148,1904.309,1904.789,1905.469,1905.609,1905.729,1905.829,1905.889,1906.049,1906.45,1906.55]},{"speaker":{"id":"spk11","name":"Shannon + Cross","title":"Credit Suisse Analyst"},"words":["Thank","you.","And","then,","Tim,","can","you","talk","a","bit","about","China,","what","you\u0027re","seeing?","Obviously,","you","had","the","issues","with","production,","but","I","mean","more","on","the","demand","side.","As","we\u0027ve","gotten","through","Chinese","New","Year","and","the","opening,","I\u0027m","just","wondering,","are","you","seeing","the","Chinese","consumer","come","back?","What","are","they","buying,","and","how","are","you","thinking","about","your","position","there?","Thank","you."],"start_times":[1909.343,1909.603,1909.783,1909.883,1910.244,1910.724,1910.904,1911.024,1911.285,1911.365,1911.585,1911.905,1913.566,1913.787,1914.047,1914.847,1915.508,1915.668,1915.768,1915.888,1916.149,1916.289,1916.729,1916.849,1916.949,1917.089,1917.269,1917.349,1917.49,1917.91,1918.991,1920.252,1920.432,1920.632,1920.812,1921.973,1922.153,1923.054,1923.494,1923.735,1924.255,1924.395,1924.615,1925.056,1925.356,1925.476,1925.676,1925.776,1926.117,1926.577,1926.757,1927.097,1927.258,1927.378,1927.558,1928.418,1928.859,1928.979,1929.099,1929.219,1929.579,1930.06,1930.24,1930.66,1930.961,1931.201]},{"speaker":{"id":"spk01","name":"Tim + Cook","title":"CEO"},"words":["Shannon,","last","quarter,","we","declined","by","7%","on","a","reported","basis,","but","we","actually","grew","on","a","constant","currency","basis.","And","that","was","despite","some","significant","of","the","supply","constraints","that","we","talked","about","earlier.","And","obviously","the","sort","of","the","COVID","restrictions","throughout","China","that","happened","in","various","different","places","throughout","the","country,","uh","also","impacted","the","the","demand","during","the","quarter","uh","when","you","look","at","uh","the","opening","that","started","happening","in","december","we","saw","a","marked","change","in","traffic","in","our","stores","as","compared","to","november","and","that","followed","through","to","demand","as","well","and","I","don\u0027t","want","to","get","into","January.","We\u0027ve","obviously","for","January","is","included","in","the","guidance","or","the","color","rather","that","Luca","provided","earlier.","But","we","did","see","a","marked","change","from","December","compared","to","November."],"start_times":[1933.382,1933.902,1934.282,1934.803,1935.943,1936.383,1936.393,1936.783,1938.984,1939.204,1939.744,1940.245,1940.425,1940.605,1941.005,1941.545,1941.645,1941.745,1942.185,1942.665,1943.666,1943.806,1943.986,1944.166,1946.167,1946.407,1947.627,1948.768,1949.068,1949.408,1949.968,1950.128,1950.528,1950.828,1951.088,1952.369,1953.129,1953.649,1953.949,1954.17,1954.25,1954.43,1954.85,1955.79,1956.31,1956.951,1957.191,1957.731,1957.871,1958.331,1958.911,1959.371,1959.692,1959.812,1961.372,1961.692,1962.393,1963.113,1963.633,1963.774,1964.174,1964.474,1964.594,1964.974,1966.355,1966.535,1966.735,1967.175,1967.315,1968.616,1969.096,1969.577,1969.797,1970.217,1970.697,1970.837,1972.598,1972.858,1973.339,1973.439,1973.879,1974.539,1974.74,1975.24,1975.36,1975.54,1976.28,1976.42,1976.901,1977.041,1978.702,1978.982,1979.242,1979.662,1980.062,1980.363,1980.903,1981.083,1982.464,1984.044,1984.144,1984.365,1984.505,1984.605,1984.805,1985.065,1985.706,1985.946,1986.526,1987.127,1987.627,1987.747,1988.347,1988.508,1988.748,1989.388,1989.528,1989.668,1990.069,1990.429,1991.129,1991.43,1991.89,1993.351,1993.511,1993.711,1994.091,1994.472,1995.172,1995.593,1996.173,1996.753,1997.494,1997.974,1998.154]},{"speaker":{"id":"spk12","name":"Teja + Skala","title":"Director of Investor Relations and Corporate Finance"},"words":["Thank","you."],"start_times":[1998.635,2002.217]},{"speaker":{"id":"spk07","name":"Operator"},"words":["Yeah.","Great.","Thanks,","Shannon.","Can","we","have","the","next","question,","please?"],"start_times":[2002.758,2003.538,2003.878,2004.139,2004.759,2004.899,2004.959,2005.059,2005.159,2005.339,2005.7]},{"speaker":{"id":"spk12","name":"Teja + Skala","title":"Director of Investor Relations and Corporate Finance"},"words":["Our","next","question","is","from","Eric","Woodring","of","Morgan","Stanley."],"start_times":[2009.602,2009.803,2010.083,2010.723,2010.923,2011.264,2011.544,2012.144,2012.324,2012.745]},{"speaker":{"id":"spk08","name":"Eric + Woodring","title":"Morgan Stanley Analyst"},"words":["Hey,","guys.","Thanks","for","taking","my","questions.","Maybe,","Tim,","first","one","for","you.","That","$2","billion","device","install","base","figure,","that\u0027s","up,","I","believe,","200","million","units","year","over","year.","That","implies","the","strongest","annual","gain","in","new","devices.","And","your","install","base","is","basically","as","far","back","as","you\u0027ve","provided","those","data","points.","And","so","I","guess","my","two","questions","are,","one,","can","you","provide","the","install","base","for","the","iPhone","at","year-end?","And","then","two,","is","there","anything","that","you","see","in","this","new","cohort","of","users","that","might","look","different","or","similar","to","past","cohorts,","either","by","demographic","or","regions","or","monetization","ramp?","And","then","I","will","follow","up.","Thanks."],"start_times":[2015.475,2015.575,2015.875,2016.136,2016.456,2016.656,2016.776,2018.117,2018.377,2018.577,2018.858,2019.038,2019.198,2019.458,2019.468,2020.499,2022.04,2022.4,2022.78,2022.981,2023.281,2023.541,2023.881,2023.961,2023.971,2024.682,2025.723,2026.043,2026.263,2026.523,2027.044,2027.224,2027.624,2027.764,2028.244,2028.585,2028.845,2028.945,2029.105,2029.846,2030.546,2030.666,2030.986,2031.167,2031.227,2031.607,2031.727,2031.987,2032.267,2032.347,2032.568,2033.068,2033.308,2033.648,2033.969,2034.069,2034.829,2034.909,2035.39,2035.55,2035.71,2036.15,2036.57,2037.771,2037.891,2037.992,2038.292,2038.392,2038.892,2039.272,2039.513,2040.193,2040.633,2040.754,2042.375,2042.475,2042.735,2043.396,2043.456,2043.577,2043.857,2043.997,2044.237,2044.498,2044.598,2044.878,2045.179,2046.2,2046.941,2048.003,2048.183,2048.384,2048.684,2049.385,2049.645,2050.106,2050.467,2050.887,2051.388,2051.648,2051.969,2053.411,2053.872,2054.573,2054.793,2055.574,2056.115,2056.375,2056.495,2056.575,2056.736,2056.956,2057.176]},{"speaker":{"id":"spk01","name":"Tim + Cook","title":"CEO"},"words":["Yeah,","the","install","base","is","now","over","2","billion","active","devices,","as","you","mentioned.","And","we","set","records","across","each","geographic","segment","and","major","product","category.","And","so","it","was","a","broad-based","change.","To","correct","one","thing","you","said,","it\u0027s","up","over","150","million","year","over","year.","The","last","report","we","reported","to","be","over","1.85.","And","so","it\u0027s","150,","which","we\u0027re","very","proud","of.","We","also","saw","strong","double","digit","in","several","of","the","emerging","markets,","which","is","very","important","to","us.","For","example,","India","and","Brazil","as","just","two","examples.","So","very,","very","strong","and","obviously","it","bodes","well","for","the","future."],"start_times":[2058.151,2058.331,2058.511,2059.031,2060.152,2060.352,2060.612,2060.6220000000003,2061.053,2061.413,2061.673,2062.333,2062.453,2062.633,2064.294,2064.434,2064.615,2064.895,2065.315,2065.875,2066.135,2066.756,2067.256,2067.396,2067.676,2068.036,2068.737,2068.917,2069.337,2069.437,2070.218,2070.458,2071.118,2072.179,2072.759,2073.159,2073.279,2073.439,2073.599,2074.38,2074.66,2075.26,2075.2700000000004,2076.661,2077.982,2078.222,2078.402,2079.042,2079.182,2079.523,2080.543,2080.743,2081.424,2081.564,2081.864,2081.8740000000003,2084.96,2085.3,2085.48,2085.4900000000002,2086.621,2086.841,2087.041,2087.321,2087.782,2090.403,2090.603,2091.063,2092.104,2092.564,2092.904,2095.445,2095.705,2096.106,2096.206,2096.346,2096.786,2097.346,2097.606,2097.726,2097.987,2098.507,2098.827,2100.328,2100.588,2101.868,2102.449,2102.569,2103.729,2103.869,2104.11,2104.41,2107.091,2107.731,2108.011,2108.272,2109.332,2109.752,2110.513,2111.973,2112.254,2112.494,2112.634,2112.754]},{"speaker":{"id":"spk08","name":"Eric + Woodring","title":"Morgan Stanley Analyst"},"words":["Great.","Thank","you","for","the","color,","Tim.","And","then,","you","know,","Luca,","obviously","the","December","quarter","was","negatively","impacted","by","the","production","challenges.","Can","you","just","maybe","unpackage","where","channel","inventory","levels","are","today","kind","of","across","the","iPhone","broadly?","And","then,","you","know,","what","the","data","that","you\u0027re","seeing","so","far","this","quarter","is","telling","you","about","iPhone","demand","deferral","versus","kind","of","iPhone","demand","destruction","and","perhaps","pushing","some","upgrades","later","into","the","year","rather","than","into","March","quarter?","And","that\u0027s","it","for","me.","Thanks."],"start_times":[2116.448,2116.648,2116.828,2116.928,2117.468,2117.568,2117.849,2118.069,2118.149,2118.769,2118.869,2119.509,2119.909,2120.57,2120.89,2121.19,2121.45,2121.71,2122.19,2122.791,2123.111,2123.851,2124.311,2124.851,2125.011,2125.152,2125.392,2126.772,2127.412,2127.633,2127.933,2128.453,2129.033,2129.273,2129.773,2129.953,2130.053,2130.454,2130.614,2130.954,2131.514,2131.614,2132.314,2132.414,2132.735,2132.935,2133.095,2133.455,2133.595,2133.815,2134.175,2134.455,2135.536,2135.756,2136.076,2136.176,2136.456,2136.636,2137.516,2137.857,2138.157,2138.637,2139.297,2139.457,2139.617,2139.977,2140.338,2140.858,2140.998,2141.378,2141.758,2141.958,2142.839,2143.139,2143.339,2143.459,2143.699,2144.019,2144.219,2144.619,2144.839,2145.3,2145.4,2145.6,2145.68,2145.82,2145.94]},{"speaker":{"id":"spk01","name":"Tim + Cook","title":"CEO"},"words":["Yeah,","Eric,","I\u0027ll","take","that","one","as","well.","The","channel","inventory","levels","on","iPhone,","we","obviously","ended","the","December","quarter","below","our","target","range,","given","the","supply","challenges","on","iPhone","14","Pro","and","iPhone","14","Pro","Max.","But","as","you","think","about","this,","keep","in","mind","that","a","year","ago,","we","also","exited","the","December","quarter","below","our","target","inventory","range.","because","of","supply","challenges","in","the","year-ago","quarter.","Not","related,","not","the","same","issue","by,","just","as","a","point.","And","so","that","hopefully","gives","you","some","flavor","of","that.","In","terms","of","what","we\u0027re","seeing","in","January,","we\u0027ve","included","In","our","color","that","Luca","provided,","kind","of","our","thinking,","it\u0027s","very","hard","to","estimate","the","recapture","because","you","have","to","know","exactly","what","would","have","happened","and","how","many","people","bought","down,","and","it","takes","a","while","to","get","those","reports.","in","during","the","quarter.","And","so","we\u0027ve","made","our","best","guess","at","it.","In","terms","of","the","sizing","of","the","constraint","in","Q1,","what","we","estimate,","although","not","with","precision,","is","that","we","would,","I","thought","we","believe","iPhone","would","have","grown","during","the","quarter","had","it","not","been","for","the","supply","shortages.","So","hopefully","that","provides","you","a","little","bit","of","color."],"start_times":[2146.61,2146.97,2147.21,2147.35,2147.57,2147.81,2147.95,2148.131,2149.371,2149.511,2149.831,2150.351,2150.931,2151.252,2152.872,2153.972,2154.673,2155.213,2155.433,2155.953,2156.413,2156.813,2156.973,2157.594,2159.194,2159.694,2160.515,2160.915,2161.675,2161.955,2161.965,2162.995,2163.456,2163.736,2163.746,2164.396,2164.616,2166.096,2166.777,2166.897,2167.037,2167.277,2167.537,2168.457,2168.717,2168.857,2169.117,2169.277,2169.377,2169.658,2169.998,2170.198,2170.638,2170.978,2171.098,2171.538,2171.918,2172.198,2172.338,2172.699,2173.219,2174.541,2175.001,2176.122,2177.202,2177.742,2177.842,2177.942,2178.382,2180.743,2180.943,2181.803,2182.183,2182.303,2182.583,2182.924,2185.004,2185.284,2185.544,2185.804,2188.105,2188.265,2188.545,2189.485,2189.906,2190.106,2190.286,2190.806,2191.226,2191.306,2191.626,2191.746,2191.986,2192.066,2192.226,2192.386,2192.646,2192.746,2193.467,2193.947,2195.954,2196.334,2196.855,2197.315,2197.515,2197.876,2198.496,2199.597,2200.137,2200.358,2200.998,2201.679,2202.039,2202.519,2203.1,2203.68,2203.84,2204.581,2207.503,2207.683,2207.863,2208.304,2209.304,2210.565,2210.786,2210.986,2211.146,2211.947,2212.147,2212.267,2212.467,2212.787,2213.067,2213.528,2213.668,2213.768,2214.088,2214.188,2214.589,2214.729,2214.969,2215.169,2218.59,2219.27,2219.591,2219.711,2220.871,2221.031,2221.232,2221.452,2221.732,2221.892,2223.012,2223.433,2223.613,2223.853,2223.993,2224.393,2224.553,2224.813,2225.674,2225.854,2226.014,2227.635,2227.955,2230.276,2230.517,2230.837,2231.677,2232.017,2232.177,2232.378,2233.218,2233.418,2233.638,2234.098,2234.559,2234.679,2234.899,2235.059,2235.419,2235.739,2235.899,2236.039,2236.48,2236.76,2236.9,2237.86,2238.481,2238.621,2238.841,2239.141,2240.202,2240.402,2240.802,2243.323,2243.463,2243.764,2243.884,2244.244,2244.364,2244.424,2244.644,2244.784,2244.884]},{"speaker":{"id":"spk08","name":"Eric + Woodring","title":"Morgan Stanley Analyst"},"words":["Yep,","that\u0027s","great.","Thanks","so","much."],"start_times":[2245.264,2247.085,2247.306,2247.586,2247.786,2247.926]},{"speaker":{"id":"spk07","name":"Operator"},"words":["Thanks,","Eric.","Can","we","have","the","next","question,","please?"],"start_times":[2248.902,2249.142,2249.802,2249.922,2250.042,2250.162,2250.262,2250.442,2250.802]},{"speaker":{"id":"spk12","name":"Teja + Skala","title":"Director of Investor Relations and Corporate Finance"},"words":["Our","next","question","comes","from","Aaron","Rakers","of","Wells","Fargo."],"start_times":[2254.583,2254.823,2255.104,2255.524,2255.764,2255.944,2256.684,2257.184,2257.304,2257.584]},{"speaker":{"id":"spk02","name":"Aaron + Rakers","title":"Wells Fargo Analyst"},"words":["Yeah,","thanks","for","taking","the","question.","I","have","two","as","well,","if","I","can.","I","guess","the","first","kind","of","question,","just","going","back","on","the","gross","margin","line,","you","know,","pretty","good","guidance","into","this","March","quarter.","I\u0027m","curious","if","you","unpack","that","a","little","bit,","specific","around","what","you\u0027re","seeing","as","far","as,","you","know,","maybe","benefits","from","component","pricing."],"start_times":[2259.965,2260.305,2260.585,2261.005,2261.305,2261.445,2261.905,2262.005,2262.165,2262.365,2262.485,2262.625,2262.745,2262.826,2263.866,2263.966,2264.126,2264.266,2264.486,2264.666,2264.746,2265.386,2265.586,2265.806,2266.026,2266.106,2266.206,2266.486,2266.847,2267.067,2267.147,2267.487,2268.087,2268.247,2268.627,2268.807,2268.967,2269.207,2270.187,2270.367,2270.747,2270.828,2270.968,2271.388,2271.548,2271.608,2271.808,2272.428,2272.968,2273.308,2273.508,2273.748,2274.108,2274.228,2274.488,2274.688,2274.769,2274.889,2275.189,2275.649,2275.829,2276.289]},{"speaker":{"id":"spk05","name":"Luca + Maestri","title":"CFO"},"words":["um","you","know","in","in","the","guidance","uh","if","you\u0027re","embedding","any","of","that","at","this","point","yeah","of","course","you","know","with","our","guidance","we","try","to","capture","every","aspect","uh","of","our","cost","structure","and","obviously","components","are","a","big","portion","of","that","yeah","so","definitely","that\u0027s","that\u0027s","included","and","keep","in","mind","again","that","Foreign","exchange,","I","mentioned","earlier,","I","think","to","Shannon,","that","the","sequential","negative","on","FX","is","50","basis","points","versus","a","year","ago,","it\u0027s","270","basis","points.","Obviously,","the","US","dollar","has","moved","a","lot","over","the","last","12","months.","So","obviously,","we","need","to","find","offsets","and","more","to","the","negative","FX","in","order","to","be","able","to","provide","this","kind","of","guidance.","And","so","obviously,","components","are","a","big","part","of","that."],"start_times":[2277.49,2278.091,2278.191,2278.451,2278.711,2278.811,2278.951,2279.712,2279.932,2280.032,2280.292,2280.672,2280.832,2280.912,2281.252,2281.332,2281.473,2283.314,2283.494,2283.614,2283.854,2284.014,2284.154,2284.314,2284.494,2284.875,2285.095,2285.335,2285.455,2286.576,2286.996,2287.956,2288.317,2288.477,2288.657,2288.877,2289.457,2289.577,2290.158,2290.958,2291.058,2291.158,2291.659,2292.099,2292.219,2293.32,2294.1,2294.6,2295.201,2295.581,2295.861,2296.342,2296.582,2296.802,2296.942,2298.003,2298.303,2299.52,2299.86,2300.46,2300.56,2300.96,2301.46,2301.5,2301.66,2301.8,2302.241,2303.181,2303.781,2304.381,2304.881,2305.301,2306.021,2306.0310000000004,2306.301,2306.661,2307.682,2308.082,2308.162,2308.442,2309.522,2309.532,2310.822,2311.262,2311.802,2312.163,2312.343,2312.703,2313.023,2313.163,2313.443,2313.523,2313.843,2313.983,2314.083,2314.0930000000003,2314.523,2315.143,2315.423,2315.923,2316.063,2316.263,2316.423,2317.484,2318.244,2318.484,2319.604,2319.764,2320.564,2321.184,2321.604,2321.684,2321.925,2322.065,2322.205,2322.425,2322.565,2323.285,2323.465,2323.665,2323.765,2324.165,2324.285,2324.525,2324.925,2325.465,2325.545,2325.625,2325.805,2326.025,2326.125]},{"speaker":{"id":"spk02","name":"Aaron + Rakers","title":"Wells Fargo Analyst"},"words":["Yep.","And","then","kind","of,","you","know,","from","a","strategic","perspective,","given","kind","of","the","things","that","we\u0027re","seeing","out","in","some","of","your","peer","group,","I\u0027m","curious,","Tim,","how","you","think","about,","you","know,","the","role","of","AI","in","your","strategy","as","far","as","particularly","in","the","services","segment,","whether","you","see","opportunities","to","excel","monetization","abilities","within","the","paid","subscriber","base","and","whether","or","not","AI","is","something","that","you\u0027re","implementing","a","bit","more","strategically","there."],"start_times":[2329.066,2329.696,2329.816,2330.377,2330.597,2330.857,2331.117,2331.537,2331.778,2331.978,2332.518,2333.179,2333.939,2334.119,2334.54,2334.74,2334.94,2335.08,2335.24,2335.6,2336.161,2336.281,2336.461,2336.541,2336.701,2336.941,2337.702,2337.982,2338.783,2339.103,2339.343,2339.523,2339.783,2340.504,2340.644,2340.824,2340.984,2341.345,2342.045,2342.906,2343.026,2343.226,2343.846,2343.966,2344.267,2344.387,2344.947,2345.047,2345.167,2345.628,2346.028,2346.308,2347.229,2347.469,2348.209,2348.43,2349.33,2350.191,2350.651,2350.971,2351.412,2351.652,2352.172,2352.953,2353.113,2353.333,2353.393,2353.673,2353.914,2354.294,2354.594,2354.914,2355.094,2355.895,2355.975,2356.155,2356.315,2356.896]},{"speaker":{"id":"spk01","name":"Tim + Cook","title":"CEO"},"words":["Yeah,","it","is","a","major","focus","of","ours.","It\u0027s","incredible","in","terms","of","how","it","can","enrich","customers\u0027","lives.","And","you","can","look","no","further","than","some","of","the","things","that","we","announced","in","the","fall","with","crash","detection","and","fall","detection.","or","back","aways","with","ECG.","I","mean,","these","things","have","literally","saved","people\u0027s","lives.","And","so","we","see","an","enormous","potential","in","this","space","to","affect","virtually","everything","we","do.","It\u0027s","obviously","a","horizontal","technology,","not","a","vertical.","And","so","it","will","affect","every","product","and","every","service","that","we","have."],"start_times":[2358.413,2359.394,2359.534,2359.694,2359.814,2360.194,2360.674,2360.915,2362.055,2362.275,2363.156,2363.316,2363.896,2364.837,2365.197,2365.337,2365.557,2365.978,2366.558,2367.198,2367.559,2368.239,2368.399,2368.599,2368.799,2369.26,2369.52,2369.68,2369.76,2369.88,2370.14,2370.3,2370.48,2372.401,2372.522,2372.682,2373.182,2374.323,2374.663,2375.403,2375.543,2375.803,2377.747,2377.987,2378.487,2378.927,2379.127,2379.748,2379.828,2380.028,2380.268,2380.528,2380.708,2381.108,2381.408,2381.848,2383.248,2383.488,2383.688,2383.968,2384.508,2384.648,2386.889,2387.589,2387.709,2387.889,2388.349,2388.609,2389.229,2389.77,2390.21,2390.37,2390.77,2391.47,2391.85,2391.91,2392.49,2393.27,2393.63,2393.71,2394.831,2394.971,2395.171,2395.251,2395.471,2395.891,2396.171,2396.791,2397.531,2397.811,2398.231,2399.051,2399.211]},{"speaker":{"id":"spk07","name":"Operator"},"words":["Thanks.","Can","we","have","the","next","question,","please?"],"start_times":[2405.333,2405.693,2405.833,2405.893,2405.993,2406.093,2406.253,2406.573]},{"speaker":{"id":"spk12","name":"Teja + Skala","title":"Director of Investor Relations and Corporate Finance"},"words":["Certainly.","Our","next","question","comes","from","Amit","Daryanani","of","Evercore."],"start_times":[2410.399,2411.281,2411.461,2411.761,2412.322,2412.623,2412.903,2414.246,2415.388,2415.608]},{"speaker":{"id":"spk03","name":"Amit + Daryanani","title":"Evercore Analyst"},"words":["Thanks","for","taking","my","question.","Yes,","the","first","one","I","have","is,","Tim,","I","think","basically","earlier","comments","that","iPhones","would","have","grown","X","the","production","issue","would","imply","that","maybe","it\u0027s","a","$7","billion","or","so","impact","that","you","had","in","December","quarter","from","the","production","challenges","on","the","high-end","models.","I\u0027m","sure","it\u0027s","tough","to","see","what","happens","this","summer","round,","but","I","think","historically","when","you\u0027ve","had","production","issues","or","things","like","this","happen,","what","has","the","consumer","behavior","been","typically?","Do","they","tend","to","go","down","towards","the","lower-end","models","and","get","the","phone","they","want","quickly,","or","do","they","just","defer","their","production?","Just","from","a","historical","perspective,","I","think.","Do","you","typically","recover","what\u0027s","deferred","out,","or","no?"],"start_times":[2418.462,2418.702,2419.063,2419.443,2419.583,2419.983,2420.543,2420.703,2421.083,2421.223,2421.323,2421.664,2422.604,2422.804,2422.864,2423.064,2423.424,2423.804,2424.125,2424.445,2425.065,2425.285,2425.485,2426.085,2426.205,2426.305,2426.686,2426.866,2427.026,2427.266,2427.406,2427.686,2427.966,2427.976,2428.086,2428.426,2428.726,2428.987,2429.387,2429.507,2429.647,2429.827,2429.927,2430.407,2430.727,2430.887,2431.007,2431.408,2432.628,2432.728,2432.828,2433.128,2433.828,2434.269,2434.429,2434.589,2434.789,2434.949,2435.249,2435.429,2435.789,2435.929,2436.169,2436.329,2436.43,2436.49,2436.69,2437.39,2437.51,2437.75,2438.43,2438.891,2439.231,2439.311,2439.491,2439.631,2439.831,2441.131,2441.352,2441.532,2441.652,2443.032,2443.512,2443.672,2443.973,2444.093,2444.233,2444.433,2444.573,2444.753,2444.993,2445.253,2445.353,2445.693,2446.033,2446.153,2446.394,2446.494,2446.674,2446.794,2447.014,2447.795,2447.855,2447.915,2448.055,2448.236,2448.556,2448.677,2448.977,2449.077,2449.198,2449.278,2449.719,2450.12,2450.18,2450.681,2450.781,2450.922,2451.383,2451.844,2452.224,2452.665,2453.046,2453.467]},{"speaker":{"id":"spk01","name":"Tim + Cook","title":"CEO"},"words":["It\u0027s","very","hard","to","estimate","is","the","real","answer","because","you","have","to","know","a","lot","of","data","and","it\u0027s","usually","only","in","hindsight","that","you","have","a","more","reasonable","view","of","it.","And","so","we","put","our","best","views","in","the","color","that","Luca","provided.","That\u0027s","kind","of","what","I","would","say."],"start_times":[2456.162,2456.342,2456.582,2456.782,2456.943,2457.743,2458.484,2458.644,2458.965,2459.405,2459.946,2460.086,2460.286,2460.386,2461.007,2461.647,2461.868,2461.988,2462.588,2462.749,2462.989,2463.469,2463.75,2463.93,2464.57,2464.711,2464.851,2465.031,2465.211,2465.431,2466.012,2466.372,2466.532,2468.595,2468.915,2469.135,2469.355,2469.696,2469.956,2471.017,2472.499,2472.599,2472.719,2473.019,2473.199,2473.5,2474.02,2476.803,2476.963,2477.043,2477.163,2477.223,2477.424]},{"speaker":{"id":"spk03","name":"Amit + Daryanani","title":"Evercore Analyst"},"words":["All","right.","And","then,","you","know,","I","guess","maybe","if","I","think","about","services","as","you","go","forward,","and,","you","know,","you\u0027ve","had","really","good","growth","in","services,","I","think,","over","the","last","several","years,","but","as","you","go","forward","in","services,","you","know,","what","do","you","think","drives","the","growth","more","so?","Is","it","the","expansion","of","your","install","base,","or","is","it","more","going","to","be","driven","by,","you","know,","our","pool","going","higher","for","you?","I\u0027m","just","curious,","how","do","you","think","about","those","two","buckets","as","you","go","forward?"],"start_times":[2481.039,2481.139,2481.439,2481.56,2481.72,2481.84,2481.94,2481.98,2482.28,2482.52,2482.62,2482.7,2482.9,2483.22,2483.92,2484.02,2484.18,2484.421,2484.961,2485.041,2485.161,2485.341,2485.481,2485.601,2485.801,2485.961,2486.141,2486.241,2486.581,2486.641,2486.862,2486.982,2487.082,2487.282,2487.462,2488.002,2488.162,2488.242,2488.362,2488.542,2488.882,2488.982,2489.563,2489.683,2490.223,2490.363,2490.423,2490.503,2490.743,2491.123,2491.263,2491.603,2491.803,2492.043,2492.183,2492.364,2492.644,2493.224,2493.304,2493.444,2493.904,2494.684,2494.784,2494.925,2495.165,2495.325,2495.465,2495.525,2495.585,2495.825,2495.985,2496.065,2496.645,2496.785,2496.945,2497.205,2497.465,2497.586,2497.666,2497.746,2497.866,2498.026,2498.126,2498.186,2498.286,2498.466,2498.646,2498.806,2499.026,2499.506,2499.606,2499.726,2499.866]},{"speaker":{"id":"spk05","name":"Luca + Maestri","title":"CFO"},"words":["I","mean,","there\u0027s","a","number","of","things,","and","I","mentioned","a","few","of","them","during","the","call,","but","The","first","step","is","always","the","install","base.","The","install","base","is","the","engine","for","services","growth.","And","the","fact","that","the","install","base","is","growing","very","nicely","and","it\u0027s","growing,","you","know,","in","a","lot","of","emerging","markets","is","growing","even","faster.","That","gives","us,","you","know,","a","larger","addressable","pool","of","customers.","That\u0027s","incredibly","important.","The","second","one","is","that","we","are","seeing","that","the","level","of","engagement","of","our","customers","already","in","our","ecosystem","continues","to","grow.","I","mentioned","that","both","transacting","accounts","and","paid","accounts","grew","double","digits.","And","so","that","bodes","very","well","for","the","future.","And","we","have","a","lot","of","transacting","accounts","that","can","move","to","paid","accounts","over","time.","The","other","aspect","that","is","very","important","for","us","is","to","continue","constantly","to","improve","the","reach","and","the","quality","of","our","services.","And","I","give","the","example","of","Apple","Pay,","which","it\u0027s","a","great","example","because","we","started","off","primarily","in","the","United","States.","Now","we\u0027ve","taken","it","to","70","markets,","millions","of","merchants.","And","so","obviously","payment","services","continue","to","set","new","highs","all","the","time","for","us.","And","as","you\u0027ve","seen","over","the","last","few","years,","we","also","launched","new","services","over","time,","and","that","obviously","contributes","to","the","growth.","We\u0027re","very","excited.","And","when","we","look","at","the","behavior","of","our","installed","base,","we","think","it\u0027s","very","promising","for","the","continued","growth","of","our","services","business."],"start_times":[2501.747,2501.807,2502.007,2502.687,2502.968,2503.228,2503.368,2503.688,2503.808,2504.048,2504.468,2504.548,2504.768,2504.888,2505.709,2505.989,2506.149,2506.529,2507.836,2507.996,2508.236,2508.536,2508.656,2508.897,2508.977,2509.397,2509.677,2509.777,2510.277,2510.537,2510.657,2510.957,2511.497,2511.897,2512.398,2512.778,2512.878,2512.998,2513.258,2513.878,2513.998,2514.298,2514.558,2514.698,2515.018,2515.318,2515.779,2515.899,2516.059,2516.559,2517.259,2517.419,2517.559,2517.659,2517.879,2517.999,2518.419,2518.859,2518.959,2519.22,2519.5,2520.46,2520.68,2521.1,2521.7,2521.84,2522.5,2522.621,2523.201,2524.901,2525.201,2525.321,2526.222,2526.662,2527.102,2528.203,2528.343,2528.683,2528.803,2528.883,2529.043,2529.143,2529.304,2529.684,2529.864,2530.004,2530.304,2530.464,2531.405,2531.585,2531.845,2532.565,2533.306,2533.446,2533.626,2534.806,2535.267,2535.407,2535.707,2537.788,2538.148,2538.508,2538.868,2539.549,2540.129,2540.329,2540.629,2542.47,2543.091,2543.411,2544.912,2545.212,2545.352,2545.552,2545.792,2546.032,2546.252,2546.392,2546.552,2548.293,2548.413,2548.533,2548.693,2548.773,2548.954,2549.054,2549.974,2550.454,2550.674,2550.955,2551.395,2551.655,2552.655,2553.156,2553.376,2555.933,2556.033,2556.333,2556.653,2556.814,2556.894,2557.094,2557.454,2557.694,2557.894,2557.994,2558.134,2558.855,2559.595,2560.516,2561.016,2561.237,2562.077,2562.197,2562.357,2563.138,2563.278,2563.478,2563.958,2564.058,2564.138,2564.299,2564.419,2564.819,2564.959,2565.219,2565.439,2566.14,2566.3,2566.38,2566.64,2567.18,2568.301,2568.421,2568.802,2569.122,2569.482,2569.542,2569.702,2570.042,2570.443,2570.583,2570.763,2571.083,2571.203,2571.213,2572.664,2575.226,2575.606,2575.706,2576.327,2576.467,2576.787,2578.188,2578.528,2579.809,2580.209,2580.309,2580.669,2580.97,2581.67,2581.81,2581.93,2582.29,2582.611,2583.65,2584.19,2584.311,2584.511,2584.791,2584.951,2585.071,2586.672,2586.972,2588.573,2589.393,2589.693,2590.014,2590.234,2591.014,2591.214,2591.574,2592.075,2593.435,2593.856,2595.116,2595.236,2595.356,2595.997,2596.177,2596.357,2597.578,2597.658,2597.798,2597.918,2598.138,2598.618,2598.758,2599.719,2599.859,2599.999,2600.419,2601.08,2601.24,2601.46,2601.58,2601.82,2603.161,2603.421,2603.761,2604.221,2604.501,2604.621,2604.782,2605.282]},{"speaker":{"id":"spk07","name":"Operator"},"words":["Perfect.","Thank","you.","Thanks,","Amit.","Can","we","have","the","next","question,","please?"],"start_times":[2609.124,2609.404,2609.644,2610.865,2611.165,2611.605,2611.745,2611.825,2611.925,2612.045,2612.226,2612.546]},{"speaker":{"id":"spk12","name":"Teja + Skala","title":"Director of Investor Relations and Corporate Finance"},"words":["Our","next","question","comes","from","harsh","Kumar","Piper","Sandler."],"start_times":[2615.703,2615.903,2616.163,2616.663,2616.923,2617.143,2617.743,2618.504,2618.864]},{"speaker":{"id":"spk13","name":"Harsh + Kumar","title":"Piper Sandler Analyst"},"words":["Yeah.","Hey,","uh,","Tim,","I","had","a","quick","question","on","emerging","markets.","Uh,","it","seems","like","you\u0027re","making","a","lot","of","strikes","in","India,","uh,","potentially","wanted","to","understand","the","kind","of","share","you","have","in","China","and","India.","And","relative","to","that,","what","would","be","your","aspirational,","but","sort","of","achievable","share","in","iPhones","in","those","territories,","whether","it\u0027s","units","or","revenues,","And","I","was","hoping","to","draw","on","your","experience","with","what","you\u0027ve","seen","in","other","countries","where","you\u0027ve","had","some","longer","presence."],"start_times":[2621.024,2621.384,2621.824,2622.044,2622.305,2622.425,2622.605,2622.725,2622.985,2623.505,2623.645,2624.045,2624.685,2624.825,2625.005,2625.285,2625.465,2625.645,2625.945,2626.005,2626.205,2626.305,2626.706,2626.966,2627.426,2628.346,2628.986,2629.366,2629.606,2630.706,2630.867,2631.067,2631.207,2631.547,2631.727,2632.047,2632.227,2632.667,2632.827,2633.627,2634.247,2634.667,2634.767,2635.047,2635.268,2635.488,2635.608,2635.868,2636.768,2636.948,2637.148,2637.248,2637.848,2638.468,2638.648,2639.128,2639.248,2639.528,2640.189,2640.509,2640.709,2641.049,2641.169,2642.385,2642.526,2642.606,2642.786,2643.066,2643.166,2643.387,2643.467,2643.647,2644.148,2644.568,2644.728,2644.949,2645.189,2645.349,2645.59,2646.01,2646.551,2646.831,2647.012,2647.192,2647.552]},{"speaker":{"id":"spk01","name":"Tim + Cook","title":"CEO"},"words":["And","looking","at","the","business","in","India,","we","set","a","quarterly","revenue","record","and","grew","very","strong","double","digits","year","over","year.","And","so","we","feel","very","good","about","how","we","performed.","And","that\u0027s","despite","the","headwinds","that","we\u0027ve","talked","about.","Taking","a","step","back,","India","is","a","hugely","exciting","market","for","us","and","is","a","major","focus.","We","brought","the","online","store","there","in","2020.","We","will","soon","bring","Apple","retail","there.","So","we\u0027re","putting","a","lot","of","emphasis","on","the","market.","There\u0027s","been","a","lot","done","from","a","financing","options","and","trade-ins","to","make","products","more","affordable","and","give","people","more","options","to","buy.","And","so","there\u0027s","a","lot","going","on","there.","We\u0027re","in","essence","taking","what","we","learned","in","China","years","ago","and","how","we","scaled","China","and","bringing","that","to","bear.","And","I","don\u0027t","have","the","exact","market","shares","in","front","of","me,","but","I","think","you","would","see","that","from","a","market","share","point","of","view","that","we","grew","around","the","world","last","quarter","on","iPhone,","despite","the","challenges","that","we","had","on","the","supply","side.","And","I","wouldn\u0027t","expect","to","have","a","difference","in","those","two","markets."],"start_times":[2650.176,2650.857,2651.237,2651.918,2652.018,2652.539,2652.819,2653.38,2653.741,2653.981,2654.081,2654.522,2654.962,2655.643,2655.843,2656.544,2656.945,2657.986,2658.287,2658.687,2658.887,2659.088,2660.47,2661.151,2662.271,2662.452,2662.752,2663.052,2663.352,2664.433,2664.653,2664.813,2666.054,2666.675,2666.935,2667.976,2668.676,2669.737,2669.917,2670.337,2670.658,2671.758,2672.099,2672.179,2672.539,2673.24,2673.7,2673.96,2674.48,2674.921,2675.421,2675.801,2676.062,2676.262,2676.402,2676.522,2676.602,2676.962,2678.744,2679.224,2679.564,2679.744,2680.085,2680.405,2680.725,2680.735,2682.726,2682.867,2683.127,2684.248,2684.808,2685.148,2685.669,2687.374,2687.535,2687.755,2688.075,2688.155,2688.495,2688.856,2690.117,2690.237,2690.357,2690.797,2691.037,2691.237,2691.337,2691.658,2692.538,2692.759,2692.879,2693.599,2694.24,2694.92,2696.321,2696.481,2697.202,2697.662,2698.043,2698.823,2698.943,2699.183,2699.564,2700.084,2701.825,2702.526,2702.926,2703.086,2703.367,2704.127,2704.227,2704.508,2704.928,2705.088,2706.609,2706.949,2707.23,2708.391,2708.871,2709.051,2709.251,2709.591,2709.752,2711.653,2711.993,2713.334,2713.534,2713.735,2713.895,2714.535,2715.276,2715.936,2716.357,2717.75,2717.91,2718.29,2721.955,2722.055,2722.295,2722.475,2722.636,2723.216,2723.597,2724.057,2724.218,2724.458,2724.578,2724.858,2725.219,2725.339,2726.601,2726.741,2727.001,2727.341,2727.582,2727.842,2727.962,2728.323,2728.663,2728.903,2729.004,2729.384,2729.664,2731.14,2731.681,2732.802,2732.942,2733.382,2734.022,2734.503,2734.803,2736.244,2738.606,2738.786,2739.266,2739.406,2739.566,2739.787,2739.887,2740.007,2740.467,2741.968,2742.188,2742.949,2743.609,2744.47,2744.71,2745.09,2746.391,2746.832,2746.932,2747.152,2747.372]},{"speaker":{"id":"spk13","name":"Harsh + Kumar","title":"Piper Sandler Analyst"},"words":["Understood.","And","for","my","follow-up,","I","had","sort","of","an","interesting","theoretical","question","on","pricing.","Assuming","we","get","the","CHIP","Act","passed","and","there\u0027s","a","whole","bunch","of","manufacturing","that","happens","in","U.S.","and","other","territories","that","are","potentially","somewhat","more","expensive","than","the","ones","you","might","be","in","now,","has","the","company","done","any","studies","to","gauge","the","elasticity","of","demand","relative","to","small","price","increases","in","your","products?"],"start_times":[2749.794,2750.594,2750.774,2750.975,2751.175,2752.015,2752.376,2752.996,2753.196,2753.356,2754.077,2754.677,2755.658,2756.198,2756.398,2758.154,2758.595,2758.715,2758.895,2759.015,2759.335,2759.695,2760.276,2760.396,2760.616,2760.696,2760.896,2761.136,2761.216,2761.937,2762.117,2762.657,2762.937,2763.378,2763.598,2763.898,2764.598,2764.759,2764.879,2765.459,2765.819,2765.999,2766.58,2766.8,2767.6,2767.76,2767.901,2768.141,2768.361,2768.781,2770.482,2771.363,2771.483,2771.843,2772.323,2772.524,2772.984,2773.164,2773.604,2773.784,2774.525,2774.645,2775.285,2775.706,2775.886,2776.206,2776.506,2777.046,2777.146,2777.307]},{"speaker":{"id":"spk01","name":"Tim + Cook","title":"CEO"},"words":["We","have","experience","in","that,","but","I","wouldn\u0027t","necessarily","draw","the","same","conclusion","that","you","have","in","terms","of","the","cost","of","the","product.","We","don\u0027t","know","at","this","point","exactly","what","that","will","be.","We\u0027re","all","in","in","terms","of","being","the","largest","customer","for","TSMC","in","Arizona","and","are","very","proud","to","take","part","in","that.","That\u0027s","what","I","would","say","about","that."],"start_times":[2780.168,2780.388,2780.929,2782.451,2782.631,2783.011,2783.271,2783.972,2784.273,2784.893,2785.134,2785.254,2785.554,2786.335,2786.996,2787.176,2787.496,2787.636,2788.077,2789.659,2790.359,2790.66,2790.74,2790.86,2795.325,2795.505,2795.785,2796.066,2796.186,2796.466,2797.928,2798.528,2798.769,2798.989,2799.229,2802.979,2803.819,2804.239,2804.74,2804.9,2805.38,2805.74,2805.98,2806.1,2806.48,2808.04,2808.22,2809.961,2810.141,2810.761,2810.981,2811.301,2811.561,2811.941,2812.561,2812.801,2813.121,2813.241,2816.922,2817.162,2817.302,2817.362,2817.522,2817.682,2817.942]},{"speaker":{"id":"spk13","name":"Harsh + Kumar","title":"Piper Sandler Analyst"},"words":["Okay,","fair","enough.","Thank","you,","Tim."],"start_times":[2819.983,2820.243,2820.403,2820.603,2820.843,2820.983]},{"speaker":{"id":"spk07","name":"Operator"},"words":["Yep.","Thanks.","Can","we","have","the","next","question,","please?"],"start_times":[2821.783,2822.843,2823.363,2823.503,2823.583,2823.684,2823.804,2824.004,2824.364]},{"speaker":{"id":"spk12","name":"Teja + Skala","title":"Director of Investor Relations and Corporate Finance"},"words":["Sure.","Our","next","question","comes","from","Wamsi","Moan","of","Bank","of","America."],"start_times":[2827.264,2827.544,2827.644,2827.864,2828.224,2828.465,2828.665,2829.125,2829.565,2829.725,2830.065,2830.225]},{"speaker":{"id":"spk04","name":"Wamsi + Moan","title":"Bank of America Analyst"},"words":["Yes,","thank","you.","Tim,","you\u0027ve","done","a","phenomenal","job","of","driving","consumer","choice","towards","higher-end","products","within","your","portfolio.","How","would","you","compare","this","cycle","for","iPhones","if","you","were","to","segment","the","pro","versus","non-pro","models","versus","the","cycles","from","the","past","few","years?","And","do","you","think","this","move","to","higher","ASPs","is","sustainable,","or","do","you","think","it","reverses","in","a","tighter","consumer","spending","environment?","I\u0027ll","have","a","follow-up."],"start_times":[2832.994,2833.194,2833.434,2833.635,2835.236,2835.376,2835.516,2835.576,2836.036,2836.336,2836.456,2837.257,2837.737,2838.037,2838.598,2839.158,2839.658,2839.919,2840.059,2841.48,2841.62,2841.8,2841.94,2842.34,2842.62,2843.081,2843.421,2843.961,2844.041,2844.161,2844.301,2844.401,2844.902,2845.082,2845.962,2846.463,2847.043,2847.764,2848.144,2848.264,2849.164,2849.345,2849.465,2849.785,2850.045,2850.505,2851.106,2851.186,2851.306,2851.506,2851.726,2852.006,2852.186,2852.547,2853.667,2853.847,2854.628,2855.228,2855.308,2855.428,2855.649,2855.769,2856.329,2856.449,2856.549,2857.27,2857.67,2858.03,2858.791,2858.951,2859.071,2859.111]},{"speaker":{"id":"spk01","name":"Tim + Cook","title":"CEO"},"words":["The","pro","has","been","a","14","pro","and","the","14","pro","max","have","done","extremely","well","up","until","the","point","where","we","had","a","supply","shortage","and","couldn\u0027t","provide","them,","couldn\u0027t","provide","the","total","of","the","demand.","And","so","it\u0027s","definitely","a","strong","pro","cycle.","I","think","there\u0027s","a","number","of","reasons","for","that,","but","the","most","important","one","is","always","the","product.","And","I","think","the","innovations","in","the","product","speak","for","themselves.","And","we","feel","very","good","about","the","product","that","we","announced","back","in","September","and","are","happy","to","now","be","at","a","point","where","we\u0027re","shipping","to","the","demand."],"start_times":[2860.93,2861.271,2861.711,2862.031,2862.411,2862.4210000000003,2865.253,2865.653,2865.773,2865.7830000000004,2866.313,2866.553,2866.954,2867.134,2869.335,2869.795,2870.135,2870.295,2870.515,2870.655,2870.856,2871.016,2871.116,2871.256,2871.316,2871.696,2872.216,2872.657,2872.997,2873.537,2875.558,2875.838,2876.699,2876.859,2877.219,2877.319,2877.419,2878.52,2878.72,2879.38,2880.201,2880.881,2881.201,2881.881,2882.322,2885.293,2885.413,2885.613,2885.873,2885.973,2886.253,2886.373,2886.873,2887.073,2887.433,2888.074,2888.234,2888.514,2889.074,2889.234,2889.454,2889.834,2890.054,2891.374,2891.594,2891.914,2892.134,2892.254,2893.035,2893.155,2893.295,2894.535,2894.795,2894.955,2896.695,2897.035,2897.856,2898.816,2899.096,2899.316,2902.036,2902.756,2903.097,2903.237,2903.377,2903.737,2903.957,2904.057,2904.677,2905.137,2905.437,2905.917,2906.977,2907.217,2907.357,2907.457,2907.557,2907.898,2908.158,2909.258,2909.618,2909.738,2909.858]},{"speaker":{"id":"spk04","name":"Wamsi + Moan","title":"Bank of America Analyst"},"words":["Tim,","do","you","think","that","this","move","to","sort","of","higher","ASPs","that","has","happened","over","the","last","few","years","is","sustainable","or","could","it","sustain","in","this","very","tough","macro","environment","that","you\u0027ve","cited?"],"start_times":[2914.809,2915.009,2915.069,2915.149,2915.35,2915.53,2916.191,2916.472,2916.632,2916.832,2917.033,2917.574,2918.135,2918.295,2918.455,2918.776,2918.956,2919.076,2919.317,2919.517,2919.918,2920.318,2921.08,2921.24,2921.44,2921.921,2922.322,2922.442,2923.524,2923.905,2924.185,2924.506,2924.967,2925.107,2925.307]},{"speaker":{"id":"spk01","name":"Tim + Cook","title":"CEO"},"words":["I","wouldn\u0027t","want","to","predict,","but","I","would","say","that","the","smartphone","for","us,","the","iPhone,","has","become","so","integral","into","people\u0027s","lives.","It","contains","their","contacts","and","their","health","information","and","their","banking","information","and","their","smart","home","and","so","many","different","parts","of","their","lives.","It\u0027s","their","payment","vehicle","and","for","many","people.","And","so","I","think","people","are","willing","to","really","stretch","to","get","the","best","they","can","afford","in","that","category."],"start_times":[2926.385,2926.465,2926.725,2926.865,2927.006,2928.106,2928.326,2928.867,2929.207,2929.647,2931.429,2932.57,2934.371,2934.571,2934.751,2934.971,2936.352,2936.692,2937.153,2937.573,2938.434,2938.774,2939.314,2941.336,2941.596,2942.276,2943.958,2944.878,2945.038,2945.339,2945.699,2946.52,2946.62,2946.82,2947.26,2948.921,2949.081,2949.282,2949.662,2950.683,2951.343,2951.563,2951.843,2952.284,2952.644,2952.724,2952.964,2953.465,2953.985,2954.185,2954.585,2955.186,2956.467,2956.688,2956.968,2959.67,2960.231,2961.412,2961.532,2961.812,2962.172,2962.332,2963.393,2965.255,2965.595,2966.196,2966.336,2966.536,2966.656,2966.956,2967.117,2968.858,2970.139,2970.299,2970.519]},{"speaker":{"id":"spk04","name":"Wamsi + Moan","title":"Bank of America Analyst"},"words":["Okay,","great.","And,","Tim,","you","clearly","emphasize","the","focus","and","importance","of","the","install","base.","If","we","think","about","the","absolute","grip","of","the","install","base","from","$1","billion","to","$2","billion","over","seven","years","from","a","device","standpoint,","how","should","we","think","about","the","penetration","of","services","or","the","growth","in","paying","customers","on","services","over","that","time","frame?","Is","that","penetration","rate","increasing","or","decreasing,","how","fast","is","that","growing","relative","to","the","growth","of","the","overall","install","base?"],"start_times":[2973.775,2974.095,2974.615,2974.955,2976.015,2976.176,2976.576,2977.076,2977.236,2977.696,2977.876,2978.496,2978.616,2978.776,2979.296,2980.336,2980.436,2980.556,2980.816,2981.297,2981.597,2982.077,2982.437,2982.537,2982.677,2983.037,2983.257,2983.2670000000003,2983.577,2983.917,2983.927,2984.197,2984.557,2984.757,2985.057,2985.457,2985.637,2985.697,2986.018,2987.298,2987.838,2988.058,2988.158,2988.398,2988.718,2989.138,2989.858,2990.078,2991.779,2991.879,2991.999,2992.339,2993.059,2993.439,2994.099,2994.239,2996.08,2996.28,2996.54,2996.86,2997.06,2997.16,2997.3,2997.92,2998.715,2999.236,2999.336,2999.896,3000.076,3000.337,3000.417,3000.617,3000.957,3001.258,3001.378,3001.478,3001.718,3001.878,3002.259,3002.619,3002.939]},{"speaker":{"id":"spk05","name":"Luca + Maestri","title":"CFO"},"words":["It\u0027s","Luca.","And","yes,","of","course,","you","know,","we","keep","track","of","that.","It\u0027s","really,","really","important","for","us.","Over","the","last","seven","years,","as","we\u0027ve","doubled","the","install","base,","we\u0027ve","seen","a","growing","engagement","of","our","customers","on","the","platform.","That","happens,","first","of","all,","by","customers","transacting","on","the","platform","and","then","moving","to","paid","accounts.","So","starting","to","pay","for","some","of","the","services.","uh","that","percentage","of","paid","accounts","tends","to","grow","over","time","we\u0027ve","seen","it","in","developed","markets","we","see","it","in","emerging","markets","and","that","is","due","to","some","of","the","reasons","that","i","was","explaining","earlier","including","the","fact","that","we","made","it","easier","for","our","for","our","customers","to","get","engaged","on","the","platform","for","example","we","offer","multiple","payment","methods","in","in","many","countries","uh","and","we\u0027ve","made","it","easier","to","explore","for","more","services","because","we\u0027ve","added","a","lot","of","services","on","the","platform","over","the","last","over","the","last","seven","years","so","to","your","question","of","course","higher","engagement","means","a","higher","percentage","of","paid","accounts","over","time","okay","thank","you","all","right","thanks","wamsi","can","we","have","the","next","question","please"],"start_times":[3003.54,3004.341,3005.427,3005.827,3006.247,3006.387,3006.728,3006.808,3006.948,3007.068,3007.248,3007.508,3007.608,3007.788,3007.888,3008.168,3008.588,3009.069,3009.369,3011.249,3011.49,3011.61,3011.85,3012.15,3012.43,3012.55,3012.75,3013.15,3013.23,3013.69,3014.051,3014.331,3014.671,3015.911,3016.572,3017.572,3017.712,3017.912,3018.452,3018.552,3018.652,3019.113,3019.373,3020.353,3020.613,3020.773,3021.073,3021.373,3022.114,3024.275,3024.375,3024.475,3025.075,3025.195,3026.195,3026.516,3026.656,3027.036,3027.616,3027.796,3028.076,3028.176,3028.376,3028.536,3028.716,3028.816,3028.937,3030.497,3030.797,3031.198,3032.058,3032.198,3032.479,3033.439,3033.739,3033.88,3034.32,3034.56,3035.08,3035.28,3035.621,3036.181,3036.261,3036.641,3037.142,3037.302,3037.542,3037.702,3037.802,3038.242,3039.523,3040.224,3040.444,3040.564,3040.924,3041.244,3041.405,3041.485,3041.565,3041.825,3042.005,3042.105,3042.445,3042.966,3043.846,3044.347,3044.507,3044.987,3045.627,3045.768,3045.968,3046.208,3046.968,3047.229,3047.509,3047.669,3047.869,3048.329,3048.429,3048.609,3049.67,3049.81,3049.91,3050.511,3050.671,3051.111,3051.371,3052.272,3052.732,3053.092,3054.153,3054.613,3055.013,3055.293,3056.654,3056.954,3057.054,3057.254,3057.494,3057.774,3058.835,3059.315,3060.515,3060.675,3060.896,3061.396,3061.616,3061.776,3062.016,3062.096,3062.256,3062.376,3063.416,3063.496,3063.616,3064.237,3064.417,3064.537,3065.157,3065.297,3065.397,3065.577,3065.897,3066.197,3067.118,3067.258,3067.438,3067.778,3067.898,3068.118,3068.378,3068.998,3070.079,3070.179,3070.439,3070.919,3071.019,3071.239,3071.659,3071.859,3074.981,3075.321,3075.501,3075.721,3076.301,3076.521,3076.741,3077.361,3077.522,3077.582,3077.722,3077.822,3078.002,3078.322]},{"speaker":{"id":"spk12","name":"Teja + Skala","title":"Director of Investor Relations and Corporate Finance"},"words":["Our","next","question","comes","from","Richard","Kramer","of","Crete","Research,","LLP."],"start_times":[3081.914,3082.074,3082.394,3082.815,3083.075,3083.295,3083.635,3084.276,3084.956,3085.336,3086.117]},{"speaker":{"id":"spk07","name":"Operator"},"words":["Operator,","can","we","move","on","to","the","next?","Richard.","Okay."],"start_times":[3099.826,3100.207,3100.447,3100.627,3101.507,3101.608,3101.688,3101.828,3101.928,3102.128]},{"speaker":{"id":"spk12","name":"Teja + Skala","title":"Director of Investor Relations and Corporate Finance"},"words":["Next","we\u0027ll","hear","from","Jim","Suva","of","Citigroup.","Jim,","your","line","is","open.","If","you","can","release","your","mute","function,","we","are","unable","to","hear","you."],"start_times":[3109.798,3110.058,3110.238,3110.398,3110.778,3111.298,3111.738,3111.919,3129.603,3129.843,3130.023,3130.283,3130.483,3132.083,3132.183,3132.323,3132.503,3132.844,3133.004,3133.184,3133.564,3133.704,3133.864,3134.184,3134.284,3134.464]},{"speaker":{"id":"spk06","name":"Jim + Suva","title":"Citigroup Analyst"},"words":["Tim","and","Luca,","you","both","mentioned","earlier","on","the","Q\u0026A","a","little","bit","about","India.","I","was","wondering","if","we\u0027re","now","entering","a","situation","of","even","more","opportunity","because","we\u0027ve","exited","COVID,","we\u0027ve","exited","countries","with","different","COVID","criteria.","We\u0027ve","also","seen","India","build","out","its","higher","speed","transmissions","and","your","market","shares","tremendously","underrepresented","there.","And","it","appears","with","the","supply","chain,","you\u0027re","looking","at","diversifying","kind","of","operational","risk,","not","specific","to","any","country,","but","just","overall","of,","you","know,","now","you","look","at","potentially","opening","up","stores","and","stuff.","Am","I","right?","That","that\u0027s","the","way","you","look","at","it","is","it\u0027s","even","more","prime","for","opportunity","now","than","ever.","And","once","you","start","opening","up","stores","there,","you","could","just","see","a","complete","green","shoot","of","adoptions","or","any","additional","commentary","on","your","view","on","India","as","now","we\u0027ve","navigated","COVID","and","supply","chain","and","so","many","challenges","over","the","past","two","years.","Thank","you,","gentlemen."],"start_times":[3135.843,3136.163,3136.303,3136.823,3137.043,3137.444,3138.164,3138.564,3138.644,3138.744,3139.024,3139.184,3139.424,3139.544,3139.964,3140.745,3140.825,3140.985,3141.405,3141.545,3141.845,3142.545,3143.065,3143.325,3144.046,3144.266,3144.706,3145.286,3146.426,3146.746,3147.066,3147.547,3148.067,3148.307,3148.867,3149.287,3149.467,3149.847,3151.468,3152.268,3152.548,3152.908,3153.448,3154.069,3154.509,3155.289,3155.669,3156.129,3156.589,3158.15,3158.29,3158.49,3159.45,3159.97,3160.591,3161.391,3162.071,3162.211,3162.331,3162.751,3162.911,3163.051,3163.571,3163.932,3164.132,3164.412,3164.512,3165.942,3166.062,3166.242,3167.523,3168.363,3168.523,3168.963,3169.083,3169.303,3169.663,3169.823,3170.103,3170.724,3171.544,3171.684,3171.844,3172.244,3172.464,3172.664,3172.784,3173.265,3173.585,3173.765,3174.305,3174.425,3175.065,3175.245,3175.425,3175.665,3175.785,3176.006,3176.106,3176.226,3176.366,3176.646,3176.786,3176.966,3177.106,3177.326,3177.646,3178.026,3178.386,3178.606,3179.287,3179.607,3179.907,3180.723,3180.903,3181.063,3181.203,3181.523,3181.904,3182.124,3182.764,3183.645,3183.785,3183.945,3184.105,3184.325,3184.405,3185.506,3185.886,3186.306,3186.726,3187.427,3187.567,3187.807,3188.367,3189.008,3189.108,3189.308,3189.628,3189.848,3190.248,3190.388,3190.589,3190.929,3191.949,3192.41,3192.53,3193.25,3193.57,3193.73,3193.93,3194.291,3194.851,3194.991,3195.111,3195.391,3195.571,3195.992,3196.192,3196.352]},{"speaker":{"id":"spk01","name":"Tim + Cook","title":"CEO"},"words":["Yeah,","Jim,","we","actually","did","fairly","well","through","COVID","in","India,","and","I\u0027m","even","more","bullish","now","on","the","other","side","of","it,","or","hopefully","on","the","other","side","of","it.","And","that\u0027s","the","reason","why","we\u0027re","investing","there","with","bringing","retail","there","and","bringing","the","online","store","there","and","putting","a","significant","amount","of","energy","there.","I\u0027m","very","bullish","on","India."],"start_times":[3197.225,3197.445,3197.685,3197.906,3198.346,3198.726,3199.126,3199.447,3199.787,3202.188,3202.449,3203.149,3203.389,3203.609,3203.89,3204.19,3204.69,3205.431,3205.551,3205.711,3205.931,3206.371,3206.552,3206.772,3206.872,3207.252,3207.332,3207.432,3207.652,3208.013,3208.193,3208.973,3209.213,3209.514,3209.654,3210.955,3211.155,3211.335,3211.835,3212.135,3212.315,3212.696,3213.096,3213.616,3213.897,3214.197,3214.317,3214.677,3215.037,3215.378,3219.24,3219.621,3219.781,3220.321,3220.581,3220.681,3221.062,3221.682,3221.902,3222.242,3222.683,3222.843]},{"speaker":{"id":"spk06","name":"Jim + Suva","title":"Citigroup Analyst"},"words":["Thank","you.","And","then","as","my","quick","follow-up,","you\u0027d","mentioned","that","services,","not","necessarily","specific","to","India,","but","services","overall","were","better","than","expected.","And","of","course,","supply","chain","was","more","challenged","than","expected.","So","what","was","the","bridge","factor","of","services","being","better","than","expected","on","the","upside?","Was","it","like","advertising","or","apps","or","paid","monthly","subscriptions","or","what","were","kind","of","the","things","that","really","surprised","you","to","the","upside","on","services?","Thank","you."],"start_times":[3226.834,3227.074,3227.294,3227.394,3227.574,3227.714,3227.854,3228.135,3229.015,3229.335,3229.775,3230.095,3231.016,3231.216,3231.796,3232.236,3232.356,3232.577,3232.737,3233.197,3233.537,3233.837,3234.177,3235.038,3236.298,3236.618,3236.738,3236.978,3237.419,3237.719,3237.899,3238.099,3238.479,3238.619,3239.019,3239.239,3239.46,3239.62,3240.34,3240.7,3241.14,3241.28,3241.861,3242.361,3242.621,3242.781,3243.261,3243.321,3243.441,3243.821,3244.002,3244.082,3244.942,3246.222,3247.143,3248.043,3248.564,3248.944,3249.304,3249.984,3250.084,3250.244,3250.364,3250.504,3250.564,3250.644,3250.845,3250.965,3251.205,3251.725,3251.865,3251.965,3252.165,3252.585,3252.725,3253.566,3253.766]},{"speaker":{"id":"spk05","name":"Luca + Maestri","title":"CFO"},"words":["It","was","primarily,","Jim,","it\u0027s","Luca.","It\u0027s","primarily","this","level","of","engagement","that","we","saw,","which","then","it","reflects","into","the","As","you","said,","the","paid","subscriptions,","we","saw","very","good","results","in","our","cloud","services","business,","in","payment","services.","Music","was","very","strong.","So","we","had","a","number","of","categories","that","set","new","records,","all-time","records,","and","they","did","a","bit","better","than","we","were","expecting","at","the","beginning","of","the","quarter.","And","so","Tim","mentioned","it.","during,","I","think,","his","prepared","remarks","that","when","you","look","at","it","in","constant","currency,","we","grew","services","double","digits,","and","that","was","on","top","of","a","24%","increase","a","year","ago.","So","it\u0027s","very","sustained","growth","that","we\u0027re","seeing."],"start_times":[3254.206,3254.306,3254.466,3255.647,3255.807,3255.947,3256.979,3257.26,3258.303,3259.065,3259.326,3259.466,3260.228,3260.409,3260.589,3262.314,3262.956,3263.317,3263.558,3264.039,3264.38,3265.188,3265.268,3265.388,3265.588,3265.729,3265.969,3268.531,3268.711,3269.672,3270.032,3270.293,3271.474,3271.614,3271.834,3272.194,3272.795,3273.535,3273.675,3274.136,3275.577,3275.957,3276.118,3276.378,3278.199,3278.36,3278.48,3278.64,3278.74,3279.02,3279.16,3279.881,3280.702,3280.962,3281.222,3282.243,3282.643,3283.204,3283.324,3283.884,3284.085,3284.165,3284.365,3284.625,3284.765,3284.865,3285.045,3285.726,3285.826,3285.926,3286.226,3286.327,3286.447,3286.947,3287.087,3288.308,3288.548,3289.089,3289.77,3290.29,3290.35,3290.55,3290.71,3291.051,3291.491,3292.671,3292.832,3292.952,3293.132,3293.232,3293.352,3293.492,3293.932,3294.672,3294.873,3295.133,3296.173,3296.513,3297.454,3297.574,3297.794,3298.014,3298.234,3299.675,3300.415,3300.425,3301.176,3301.656,3301.736,3301.996,3302.356,3302.756,3302.876,3303.097,3303.577,3303.877,3304.017,3304.197]},{"speaker":{"id":"spk06","name":"Jim + Suva","title":"Citigroup Analyst"},"words":["Thank","you","so","much,","and","congratulations","to","you","and","all","your","teams."],"start_times":[3306.738,3306.959,3307.119,3307.279,3307.519,3307.639,3308.559,3308.719,3308.859,3308.96,3309.08,3309.22]},{"speaker":{"id":"spk07","name":"Operator"},"words":["Thanks,","Jim.","Can","we","have","the","next","question,","please?"],"start_times":[3311.881,3312.161,3312.641,3312.741,3312.801,3312.901,3313.002,3313.182,3313.522]},{"speaker":{"id":"spk12","name":"Teja + Skala","title":"Director of Investor Relations and Corporate Finance"},"words":["Our","next","question","will","come","from","Chris","Sankar","of","Cowan","\u0026","Company."],"start_times":[3316.323,3316.483,3316.723,3317.284,3317.484,3317.664,3317.844,3318.604,3319.144,3319.305,3319.315,3319.705]},{"speaker":{"id":"spk09","name":"Chris + Sankar","title":"Cowan \u0026 Company Analyst"},"words":["Yeah,","hi.","Thanks","for","taking","my","question.","I","have","two","of","them,","too.","First","one,","Tim","or","Luca,","you","mentioned","how","the","macro","did","soften","and","had","an","impact.","And","as","consumers","tighten","their","belts,","when","you","look","across","your","hardware","products","and","service","businesses,","where","have","you","seen","the","biggest","impact","and","where","have","you","seen","the","least","impact","from","the","softening","macro?","And","then","I","had","a","quick","follow-up."],"start_times":[3320.065,3321.546,3321.746,3321.886,3321.986,3322.146,3322.286,3322.686,3322.726,3322.886,3323.066,3323.166,3323.367,3323.547,3323.827,3323.967,3324.207,3324.327,3324.727,3324.847,3325.728,3325.928,3326.068,3326.548,3326.748,3327.248,3327.389,3327.609,3327.769,3328.589,3328.769,3328.909,3329.41,3329.75,3329.93,3331.11,3331.23,3331.31,3331.511,3331.851,3332.011,3332.491,3332.891,3333.091,3333.492,3334.612,3334.772,3334.892,3334.972,3335.112,3335.292,3335.693,3336.193,3336.273,3336.413,3336.533,3336.633,3336.813,3336.973,3337.293,3338.274,3338.434,3338.574,3339.074,3339.474,3339.575,3339.675,3339.715,3339.795,3339.855,3340.095]},{"speaker":{"id":"spk01","name":"Tim + Cook","title":"CEO"},"words":["We","think","there","were","some","impact","across","the","products","and","in","services.","Probably","the","ones","that","we","saw","the","most","impact","on","were","Mac","and","wearables.","You","can","see","that","in","those","numbers.","And","probably","the","least","would","have","been","iPhone."],"start_times":[3342.677,3342.817,3343.037,3343.197,3343.458,3343.918,3345.499,3346.58,3346.76,3347.661,3347.881,3348.021,3351.184,3351.884,3355.407,3355.587,3355.727,3355.867,3356.087,3356.228,3356.588,3357.248,3357.489,3358.79,3359.13,3359.23,3361.432,3361.572,3361.772,3361.992,3362.753,3362.893,3364.014,3365.215,3365.395,3366.015,3366.355,3368.637,3368.817,3368.937,3369.178]},{"speaker":{"id":"spk09","name":"Chris + Sankar","title":"Cowan \u0026 Company Analyst"},"words":["Got","it.","Got","it.","Very","helpful,","Tim.","And","then","just","a","quick","follow-up","on","the","MAC.","You","know,","the","PC","industry","is","expecting","decline","in","PC","shipments","this","year","also.","How","to","think","about","the","MAC","relative","to","kind","of","like","where","the","PC","industry","as","a","whole","is","expecting","the","shipments","to","end","up?","Is","there","any","color","you","can","give","on","that?","Thank","you","very","much."],"start_times":[3372.796,3373.056,3373.216,3373.456,3373.556,3373.757,3374.117,3374.337,3374.437,3374.737,3374.957,3375.057,3375.297,3376.198,3376.318,3376.418,3377.279,3377.379,3377.519,3377.659,3377.979,3378.319,3378.439,3378.959,3379.34,3379.46,3379.76,3380.16,3380.34,3380.62,3381.781,3381.921,3382.061,3382.261,3382.501,3382.702,3383.062,3383.682,3383.862,3384.042,3384.102,3384.303,3384.543,3385.103,3385.423,3385.743,3385.883,3385.943,3386.124,3386.264,3386.784,3386.904,3387.304,3387.444,3387.644,3388.225,3388.305,3388.445,3388.585,3388.805,3388.925,3389.045,3389.185,3389.285,3389.425,3389.606,3389.726,3389.886]},{"speaker":{"id":"spk01","name":"Tim + Cook","title":"CEO"},"words":["The","industry","is","very","challenged,","as","you","say.","The","industry","is","contracting.","I","think","from","us,","though,","and","I","don\u0027t","know","how","this","year","will","play","out,","so","I","don\u0027t","want","to","predict","the","year,","but","over","the","long","run,","we","have","a","market","that","is","a","reasonable-sized","market,","a","big","market,","and","we","have","low","share.","And","we","have","a","competitive","advantage","with","Apple","Silicon.","And","so","strategically,","I","think","we\u0027re","well","positioned","in","the","market,","albeit","I","think","it","will","be","a","little","rough","in","the","short","term."],"start_times":[3391.042,3391.382,3392.002,3393.303,3393.563,3394.103,3394.203,3394.403,3396.303,3396.683,3397.083,3397.224,3398.204,3398.344,3399.144,3399.704,3400.024,3402.005,3402.165,3402.425,3402.605,3402.965,3403.165,3403.385,3403.585,3403.785,3404.105,3404.305,3404.445,3404.505,3404.685,3404.825,3404.985,3405.445,3405.585,3406.546,3406.846,3407.106,3407.286,3407.726,3408.866,3409.106,3409.386,3409.866,3410.347,3410.587,3410.747,3410.867,3411.927,3412.367,3413.027,3413.287,3414.608,3414.828,3415.068,3415.388,3415.828,3417.288,3417.468,3417.709,3418.069,3418.169,3418.669,3419.31,3419.75,3420.03,3421.231,3421.452,3421.852,3423.954,3424.054,3424.334,3424.614,3424.915,3425.795,3426.416,3426.536,3428.437,3428.898,3428.978,3429.178,3429.278,3429.458,3429.578,3429.658,3430.559,3430.859,3430.96,3431.06,3431.32]},{"speaker":{"id":"spk09","name":"Chris + Sankar","title":"Cowan \u0026 Company Analyst"},"words":["Thanks","a","lot,","Tim."],"start_times":[3434.442,3434.683,3434.743,3434.923]},{"speaker":{"id":"spk01","name":"Tim + Cook","title":"CEO"},"words":["Yeah."],"start_times":[3435.363]},{"speaker":{"id":"spk07","name":"Operator"},"words":["Thanks,","Krish.","A","replay","of","today\u0027s","call","will","be","available","for","two","weeks","on","Apple","Podcasts.","as","a","webcast","on","apple.com","slash","investor","and","via","telephone.","The","number","for","the","telephone","replay","is","866-583-1035.","Please","enter","confirmation","code","654-1285,","followed","by","the","pound","sign.","These","replays","will","be","available","by","approximately","5","p.m.","Pacific","time","today.","Members","of","the","press","with","additional","questions","can","contact","Josh","Rosenstock","at","408-862-1142.","Financial","analysts","can","contact","me","with","additional","questions","at","669-227-2402.","Thank","you","again","for","joining","us."],"start_times":[3436.444,3436.724,3437.765,3437.865,3438.346,3438.446,3438.846,3439.286,3439.487,3439.627,3440.147,3440.327,3440.528,3441.108,3441.248,3441.508,3442.867,3442.987,3443.067,3443.708,3443.948,3444.769,3445.029,3446.13,3446.25,3446.47,3447.671,3447.811,3448.091,3448.252,3448.352,3448.812,3449.593,3452.115,3454.817,3455.117,3455.458,3456.098,3458.52,3459.661,3459.941,3460.041,3460.141,3460.402,3461.543,3461.783,3462.163,3462.323,3462.443,3462.864,3463.024,3463.034,3464.005,3464.305,3464.665,3465.026,3466.331,3466.631,3466.732,3466.852,3467.212,3467.392,3467.773,3468.253,3468.433,3468.914,3469.194,3469.855,3471.897,3474.28,3474.741,3475.181,3475.361,3475.782,3476.082,3476.262,3476.623,3477.224,3477.284,3477.364,3477.584,3477.844,3478.185,3478.505,3478.845]}]}' + content_type: application/json + headers: + Accept-Ranges: bytes + Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With, + apikey, x-api-key, x-api-version-schema, x-auth-token, x-auth-type, x-client-build-version, + x-client-commit-id, x-client-device-type, x-behavior-signal, x-request-id + Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS + Access-Control-Allow-Origin: '*' + Access-Control-Expose-Headers: x-trial-calls-remaining, x-trial-expires, x-ratelimit-remaining, + x-api-version-schema, x-request-id, retry-after, x-region, x-fleet + Access-Control-Max-Age: '3600' + Age: '897375' + Cache-Control: public, max-age=300 + Etag: '"964b43e08f6b38a0f84313ec6fec8ad7-02649c8a0b659e64-v4"' + Transfer-Encoding: chunked + Vary: Accept-Encoding, x-api-version-schema + X-Api-Version-Schema: v4 + X-Cache: HIT + X-Cache-Tier: DISK + X-Fleet: atlas + X-Plan-Type: demo + X-Ratelimit-Remaining: '89' + X-Region: US East + X-Request-Id: 4adeb8e2-cea2-4b78-b0e3-c844c6efacbd + method: GET + status: 200 + url: https://api.earningscall.dev/transcript?apikey=demo&exchange=NASDAQ&symbol=AAPL&year=2023&quarter=1&level=3 diff --git a/tests/data/aapl-q1-2030-not-authorized-l2.yaml b/tests/data/aapl-q1-2030-not-authorized-l2.yaml index f283e02..99795cc 100644 --- a/tests/data/aapl-q1-2030-not-authorized-l2.yaml +++ b/tests/data/aapl-q1-2030-not-authorized-l2.yaml @@ -13,4 +13,4 @@ responses: X-Cache: Error from cloudfront method: GET status: 403 - url: https://v2.api.earningscall.biz/transcript?apikey=demo&exchange=NASDAQ&symbol=AAPL&year=2030&quarter=1&level=2 + url: https://api.earningscall.dev/transcript?apikey=demo&exchange=NASDAQ&symbol=AAPL&year=2030&quarter=1&level=2 diff --git a/tests/data/aapl-q1-2030-not-authorized.yaml b/tests/data/aapl-q1-2030-not-authorized.yaml index 91b453c..c872215 100644 --- a/tests/data/aapl-q1-2030-not-authorized.yaml +++ b/tests/data/aapl-q1-2030-not-authorized.yaml @@ -13,4 +13,4 @@ responses: X-Cache: Error from cloudfront method: GET status: 403 - url: https://v2.api.earningscall.biz/transcript?apikey=demo&exchange=NASDAQ&symbol=AAPL&year=2030&quarter=1&level=1 + url: https://api.earningscall.dev/transcript?apikey=demo&exchange=NASDAQ&symbol=AAPL&year=2030&quarter=1&level=1 diff --git a/tests/data/aapl-q1-2030-not-found.yaml b/tests/data/aapl-q1-2030-not-found.yaml index 6856384..6740470 100644 --- a/tests/data/aapl-q1-2030-not-found.yaml +++ b/tests/data/aapl-q1-2030-not-found.yaml @@ -14,4 +14,4 @@ responses: X-Cache: Error from cloudfront method: GET status: 404 - url: https://v2.api.earningscall.biz/transcript?apikey=demo&exchange=NASDAQ&symbol=AAPL&year=2030&quarter=1&level=1 + url: https://api.earningscall.dev/transcript?apikey=demo&exchange=NASDAQ&symbol=AAPL&year=2030&quarter=1&level=1 diff --git a/tests/data/aapl-q1-2030-server-error.yaml b/tests/data/aapl-q1-2030-server-error.yaml index b10c3fa..766ecb4 100644 --- a/tests/data/aapl-q1-2030-server-error.yaml +++ b/tests/data/aapl-q1-2030-server-error.yaml @@ -13,4 +13,4 @@ responses: X-Cache: Error from cloudfront method: GET status: 500 - url: https://v2.api.earningscall.biz/transcript?apikey=demo&exchange=NASDAQ&symbol=AAPL&year=2030&quarter=1&level=1 + url: https://api.earningscall.dev/transcript?apikey=demo&exchange=NASDAQ&symbol=AAPL&year=2030&quarter=1&level=1 diff --git a/tests/data/demo-symbols-v2-alpha.yaml b/tests/data/demo-symbols-v2-alpha.yaml index 6ad470d..c59183b 100644 --- a/tests/data/demo-symbols-v2-alpha.yaml +++ b/tests/data/demo-symbols-v2-alpha.yaml @@ -716,4 +716,4 @@ responses: content_type: text/plain method: GET status: 200 - url: https://v2.api.earningscall.biz/transcript?apikey=demo&exchange=NASDAQ&symbol=AAPL&year=2022&quarter=1&level=1 + url: https://api.earningscall.dev/transcript?apikey=demo&exchange=NASDAQ&symbol=AAPL&year=2022&quarter=1&level=1 diff --git a/tests/data/demo-symbols-v2.yaml b/tests/data/demo-symbols-v2.yaml index fb96d93..d3c7ca6 100644 --- a/tests/data/demo-symbols-v2.yaml +++ b/tests/data/demo-symbols-v2.yaml @@ -5,4 +5,4 @@ responses: content_type: text/plain method: GET status: 200 - url: https://v2.api.earningscall.biz/symbols-v2.txt?apikey=demo + url: https://api.earningscall.dev/symbols-v2.txt?apikey=demo diff --git a/tests/data/get-calendar-500-error.yaml b/tests/data/get-calendar-500-error.yaml index 9602878..5d59fdc 100644 --- a/tests/data/get-calendar-500-error.yaml +++ b/tests/data/get-calendar-500-error.yaml @@ -11,4 +11,4 @@ responses: X-Plan-Name: demo method: GET status: 500 - url: https://v2.api.earningscall.biz/calendar?apikey=XXXXXXXXXXX&year=2020&month=1&day=1 + url: https://api.earningscall.dev/calendar?apikey=XXXXXXXXXXX&year=2020&month=1&day=1 diff --git a/tests/data/get-calendar-not-found-response.yaml b/tests/data/get-calendar-not-found-response.yaml index 017bb39..0bf905a 100644 --- a/tests/data/get-calendar-not-found-response.yaml +++ b/tests/data/get-calendar-not-found-response.yaml @@ -11,4 +11,4 @@ responses: X-Plan-Name: starter method: GET status: 404 - url: https://v2.api.earningscall.biz/calendar?apikey=XXXXXXXXXXX&year=2018&month=1&day=1 + url: https://api.earningscall.dev/calendar?apikey=XXXXXXXXXXX&year=2018&month=1&day=1 diff --git a/tests/data/get-calendar-schema-v4-response.yaml b/tests/data/get-calendar-schema-v4-response.yaml new file mode 100644 index 0000000..56656ba --- /dev/null +++ b/tests/data/get-calendar-schema-v4-response.yaml @@ -0,0 +1,46 @@ +responses: +- response: + auto_calculate_content_length: false + body: '{"events":[{"symbol":"TKUGF","company_name":"Takeuchi Mfg Co Ltd","exchange":"OTC","conference_date":"2025-01-10T00:00:00-05:00","year":2024,"quarter":3,"transcript_ready":false},{"symbol":"6506.T","company_name":"YASKAWA + Electric Corporation","exchange":"TSE","conference_date":"2025-01-10T00:00:00-05:00","year":2024,"quarter":3,"transcript_ready":false},{"symbol":"0MRM.L","company_name":"Bang + \u0026 Olufsen a/s","exchange":"LSE","conference_date":"2025-01-10T10:00:00+01:00","year":2025,"quarter":2,"transcript_ready":true},{"symbol":"SBRY.L","company_name":"J + Sainsbury plc","exchange":"LSE","conference_date":"2025-01-10T04:00:00-05:00","year":2025,"quarter":3,"transcript_ready":true},{"symbol":"CJR.B","company_name":"Corus + Entertainment Inc.","exchange":"TSX","conference_date":"2025-01-10T08:00:00-05:00","year":2025,"quarter":1,"transcript_ready":true},{"symbol":"NEOG","company_name":"Neogen + Corporation","exchange":"NASDAQ","conference_date":"2025-01-10T08:30:00-05:00","year":2025,"quarter":2,"transcript_ready":true},{"symbol":"TLRY","company_name":"Tilray + Brands, Inc.","exchange":"NASDAQ","conference_date":"2025-01-10T08:30:00-05:00","year":2025,"quarter":2,"transcript_ready":true},{"symbol":"WBA","company_name":"Walgreens + Boots Alliance, Inc.","exchange":"NASDAQ","conference_date":"2025-01-10T08:30:00-05:00","year":2025,"quarter":1,"transcript_ready":true},{"symbol":"ETWO","company_name":"E2open + Parent Holdings, Inc.","exchange":"NYSE","conference_date":"2025-01-10T08:30:00-05:00","year":2025,"quarter":3,"transcript_ready":true},{"symbol":"SNX","company_name":"TD + SYNNEX Corporation","exchange":"NYSE","conference_date":"2025-01-10T09:00:00-05:00","year":2024,"quarter":4,"transcript_ready":true},{"symbol":"DAL","company_name":"Delta + Air Lines, Inc.","exchange":"NYSE","conference_date":"2025-01-10T10:00:00-05:00","year":2024,"quarter":4,"transcript_ready":true},{"symbol":"SVNDF","company_name":"Seven + \u0026 I Hldgs Co Ltd","exchange":"OTC","conference_date":"2025-01-10T10:00:00-05:00","year":2024,"quarter":3,"transcript_ready":true},{"symbol":"STZ","company_name":"Constellation + Brands, Inc.","exchange":"NYSE","conference_date":"2025-01-10T10:30:00-05:00","year":2025,"quarter":3,"transcript_ready":true},{"symbol":"PSMT","company_name":"PriceSmart, + Inc.","exchange":"NASDAQ","conference_date":"2025-01-10T12:00:00-05:00","year":2025,"quarter":1,"transcript_ready":true},{"symbol":"KRMD","company_name":"KORU + Medical Systems, Inc.","exchange":"NASDAQ","conference_date":"2025-01-10T16:30:00-05:00","year":2024,"quarter":4,"transcript_ready":true},{"symbol":"WDFC","company_name":"WD-40 + Company","exchange":"NASDAQ","conference_date":"2025-01-10T17:00:00-05:00","year":2025,"quarter":1,"transcript_ready":true}]}' + content_type: application/json + headers: + Accept-Ranges: bytes + Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With, + apikey, x-api-key, x-api-version-schema, x-auth-token, x-auth-type, x-client-build-version, + x-client-commit-id, x-client-device-type, x-behavior-signal, x-request-id + Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS + Access-Control-Allow-Origin: '*' + Access-Control-Expose-Headers: x-trial-calls-remaining, x-trial-expires, x-ratelimit-remaining, + x-api-version-schema, x-request-id, retry-after, x-region, x-fleet + Access-Control-Max-Age: '3600' + Age: '231' + Cache-Control: public, max-age=500 + Etag: '"ee4a7a6b02c66478551064c3b62cdd8c-v4"' + Last-Modified: Thu, 15 Oct 2026 20:00:37 GMT + Vary: Accept-Encoding, x-api-version-schema + X-Api-Version-Schema: v4 + X-Cache: HIT + X-Cache-Tier: DISK + X-Fleet: atlas + X-Plan-Type: demo + X-Ratelimit-Remaining: '89' + X-Region: US East + X-Request-Id: ecbe2c36-5713-4c48-8376-68dbeb363655 + method: GET + status: 200 + url: https://api.earningscall.dev/calendar?apikey=demo&year=2025&month=1&day=10 diff --git a/tests/data/get-calendar-successful-response.yaml b/tests/data/get-calendar-successful-response.yaml index 766683d..bbc880a 100644 --- a/tests/data/get-calendar-successful-response.yaml +++ b/tests/data/get-calendar-successful-response.yaml @@ -59,4 +59,4 @@ responses: x-amz-server-side-encryption: AES256 method: GET status: 200 - url: https://v2.api.earningscall.biz/calendar?apikey=XXXXXXXXXXX&year=2025&month=2&day=10 + url: https://api.earningscall.dev/calendar?apikey=XXXXXXXXXXX&year=2025&month=2&day=10 diff --git a/tests/data/meta-q3-2024-not-authorized.yaml b/tests/data/meta-q3-2024-not-authorized.yaml index 68e77e4..1628930 100644 --- a/tests/data/meta-q3-2024-not-authorized.yaml +++ b/tests/data/meta-q3-2024-not-authorized.yaml @@ -12,4 +12,4 @@ responses: X-Plan-Name: basic method: GET status: 403 - url: https://v2.api.earningscall.biz/audio?apikey=foobar&exchange=NASDAQ&symbol=META&year=2024&quarter=3 + url: https://api.earningscall.dev/audio?apikey=foobar&exchange=NASDAQ&symbol=META&year=2024&quarter=3 diff --git a/tests/data/meta-q3-2024-not-found.yaml b/tests/data/meta-q3-2024-not-found.yaml index 195cacc..f9e35e4 100644 --- a/tests/data/meta-q3-2024-not-found.yaml +++ b/tests/data/meta-q3-2024-not-found.yaml @@ -13,4 +13,4 @@ responses: X-Cache: Error from cloudfront method: GET status: 404 - url: https://v2.api.earningscall.biz/audio?apikey=foobar&exchange=NASDAQ&symbol=META&year=2024&quarter=3 + url: https://api.earningscall.dev/audio?apikey=foobar&exchange=NASDAQ&symbol=META&year=2024&quarter=3 diff --git a/tests/data/meta-q3-2024-other-error.yaml b/tests/data/meta-q3-2024-other-error.yaml index 71cecd2..42271f9 100644 --- a/tests/data/meta-q3-2024-other-error.yaml +++ b/tests/data/meta-q3-2024-other-error.yaml @@ -12,4 +12,4 @@ responses: X-Plan-Name: basic method: GET status: 500 - url: https://v2.api.earningscall.biz/audio?apikey=foobar&exchange=NASDAQ&symbol=META&year=2024&quarter=3 + url: https://api.earningscall.dev/audio?apikey=foobar&exchange=NASDAQ&symbol=META&year=2024&quarter=3 diff --git a/tests/data/meta-q3-2024-slides-not-authorized.yaml b/tests/data/meta-q3-2024-slides-not-authorized.yaml index d3de5ad..9d0b7ee 100644 --- a/tests/data/meta-q3-2024-slides-not-authorized.yaml +++ b/tests/data/meta-q3-2024-slides-not-authorized.yaml @@ -12,4 +12,4 @@ responses: X-Plan-Name: basic method: GET status: 403 - url: https://v2.api.earningscall.biz/slides?apikey=foobar&exchange=NASDAQ&symbol=META&year=2024&quarter=3 \ No newline at end of file + url: https://api.earningscall.dev/slides?apikey=foobar&exchange=NASDAQ&symbol=META&year=2024&quarter=3 \ No newline at end of file diff --git a/tests/data/meta-q3-2024-slides-not-found.yaml b/tests/data/meta-q3-2024-slides-not-found.yaml index 291bf8d..7e39fd8 100644 --- a/tests/data/meta-q3-2024-slides-not-found.yaml +++ b/tests/data/meta-q3-2024-slides-not-found.yaml @@ -13,4 +13,4 @@ responses: X-Cache: Error from cloudfront method: GET status: 404 - url: https://v2.api.earningscall.biz/slides?apikey=foobar&exchange=NASDAQ&symbol=META&year=2024&quarter=3 \ No newline at end of file + url: https://api.earningscall.dev/slides?apikey=foobar&exchange=NASDAQ&symbol=META&year=2024&quarter=3 \ No newline at end of file diff --git a/tests/data/meta-q3-2024-slides-other-error.yaml b/tests/data/meta-q3-2024-slides-other-error.yaml index 33fd647..b21e1af 100644 --- a/tests/data/meta-q3-2024-slides-other-error.yaml +++ b/tests/data/meta-q3-2024-slides-other-error.yaml @@ -12,4 +12,4 @@ responses: X-Plan-Name: basic method: GET status: 500 - url: https://v2.api.earningscall.biz/slides?apikey=foobar&exchange=NASDAQ&symbol=META&year=2024&quarter=3 \ No newline at end of file + url: https://api.earningscall.dev/slides?apikey=foobar&exchange=NASDAQ&symbol=META&year=2024&quarter=3 \ No newline at end of file diff --git a/tests/data/msft-company-events.yaml b/tests/data/msft-company-events.yaml index 55d31eb..77287b0 100644 --- a/tests/data/msft-company-events.yaml +++ b/tests/data/msft-company-events.yaml @@ -25,4 +25,4 @@ responses: content_type: text/plain method: GET status: 200 - url: https://v2.api.earningscall.biz/events?apikey=demo&exchange=NASDAQ&symbol=MSFT + url: https://api.earningscall.dev/events?apikey=demo&exchange=NASDAQ&symbol=MSFT diff --git a/tests/data/msft-q1-2022-audio-file-short-clip.yaml b/tests/data/msft-q1-2022-audio-file-short-clip.yaml index 21b2e43..f196a00 100644 --- a/tests/data/msft-q1-2022-audio-file-short-clip.yaml +++ b/tests/data/msft-q1-2022-audio-file-short-clip.yaml @@ -5507,4 +5507,4 @@ responses: x-amz-server-side-encryption: AES256 method: GET status: 200 - url: https://v2.api.earningscall.biz/audio?apikey=demo&exchange=NASDAQ&symbol=MSFT&year=2022&quarter=1 + url: https://api.earningscall.dev/audio?apikey=demo&exchange=NASDAQ&symbol=MSFT&year=2022&quarter=1 diff --git a/tests/data/msft-q1-2022-slide-deck-short-clip.yaml b/tests/data/msft-q1-2022-slide-deck-short-clip.yaml index 3609abb..51c8c16 100644 --- a/tests/data/msft-q1-2022-slide-deck-short-clip.yaml +++ b/tests/data/msft-q1-2022-slide-deck-short-clip.yaml @@ -59,4 +59,4 @@ startxref X-Cache: Hit from cloudfront method: GET status: 200 - url: https://v2.api.earningscall.biz/slides?apikey=demo&exchange=NASDAQ&symbol=MSFT&year=2022&quarter=1 \ No newline at end of file + url: https://api.earningscall.dev/slides?apikey=demo&exchange=NASDAQ&symbol=MSFT&year=2022&quarter=1 \ No newline at end of file diff --git a/tests/data/msft-transcript-response.yaml b/tests/data/msft-transcript-response.yaml index 75f6d6e..08f48f5 100644 --- a/tests/data/msft-transcript-response.yaml +++ b/tests/data/msft-transcript-response.yaml @@ -712,4 +712,4 @@ responses: content_type: text/plain method: GET status: 200 - url: https://v2.api.earningscall.biz/transcript?apikey=demo&exchange=NASDAQ&symbol=MSFT&year=2023&quarter=1&level=1 + url: https://api.earningscall.dev/transcript?apikey=demo&exchange=NASDAQ&symbol=MSFT&year=2023&quarter=1&level=1 diff --git a/tests/data/nvda-q2-2025-level-4-data-missing.yaml b/tests/data/nvda-q2-2025-level-4-data-missing.yaml index 22dd331..7ba129a 100644 --- a/tests/data/nvda-q2-2025-level-4-data-missing.yaml +++ b/tests/data/nvda-q2-2025-level-4-data-missing.yaml @@ -676,4 +676,4 @@ responses: x-amz-server-side-encryption: AES256 method: GET status: 200 - url: https://v2.api.earningscall.biz/transcript?apikey=demo&exchange=NASDAQ&symbol=NVDA&year=2025&quarter=2&level=4 + url: https://api.earningscall.dev/transcript?apikey=demo&exchange=NASDAQ&symbol=NVDA&year=2025&quarter=2&level=4 diff --git a/tests/data/sp500-company-list-failed.yaml b/tests/data/sp500-company-list-failed.yaml index a122eb2..4f45658 100644 --- a/tests/data/sp500-company-list-failed.yaml +++ b/tests/data/sp500-company-list-failed.yaml @@ -1021,4 +1021,4 @@ responses: x-amz-server-side-encryption: AES256 method: GET status: 500 - url: https://v2.api.earningscall.biz/symbols/sp500.txt?apikey=foobar + url: https://api.earningscall.dev/symbols/sp500.txt?apikey=foobar diff --git a/tests/data/sp500-company-list.yaml b/tests/data/sp500-company-list.yaml index 75e72b3..802e810 100644 --- a/tests/data/sp500-company-list.yaml +++ b/tests/data/sp500-company-list.yaml @@ -1021,4 +1021,4 @@ responses: x-amz-server-side-encryption: AES256 method: GET status: 200 - url: https://v2.api.earningscall.biz/symbols/sp500.txt?apikey=foobar + url: https://api.earningscall.dev/symbols/sp500.txt?apikey=foobar diff --git a/tests/data/symbols-v2-missing-edge-cases.yaml b/tests/data/symbols-v2-missing-edge-cases.yaml index dec8740..cb4d778 100644 --- a/tests/data/symbols-v2-missing-edge-cases.yaml +++ b/tests/data/symbols-v2-missing-edge-cases.yaml @@ -7,4 +7,4 @@ responses: content_type: text/plain method: GET status: 200 - url: https://v2.api.earningscall.biz/symbols-v2.txt + url: https://api.earningscall.dev/symbols-v2.txt diff --git a/tests/data/symbols-v2.yaml b/tests/data/symbols-v2.yaml index 2ea6d2f..71ec697 100644 --- a/tests/data/symbols-v2.yaml +++ b/tests/data/symbols-v2.yaml @@ -3076,4 +3076,4 @@ responses: content_type: text/plain method: GET status: 200 - url: https://v2.api.earningscall.biz/symbols-v2.txt + url: https://api.earningscall.dev/symbols-v2.txt diff --git a/tests/test_api.py b/tests/test_api.py index 3d78d1b..e28e011 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1,10 +1,15 @@ +import email.utils +import importlib import importlib.metadata +import re +from datetime import datetime, timedelta, timezone import pytest import requests import responses import earningscall +import earningscall.api from earningscall.api import ( API_BASE, DOMAIN, @@ -12,11 +17,13 @@ get_earnings_call_version, get_events, get_exchanges_json, + get_retry_after_seconds, get_sp500_companies_txt_file, get_symbols_v2, get_user_agent, purge_cache, ) +from earningscall.errors import InvalidApiKeyError def test_get_api_key_returns_earningscall_api_key_when_set(monkeypatch): @@ -200,3 +207,115 @@ def test_get_exchanges_json_raises_on_404(setup_api): responses.add(responses.GET, f"https://{DOMAIN}/exchanges.json", status=404) with pytest.raises(requests.HTTPError, match="404 Client Error"): get_exchanges_json() + + +def test_api_base_defaults_to_api_earningscall_dev(monkeypatch): + monkeypatch.delenv("EARNINGSCALL_API_BASE", raising=False) + assert importlib.reload(earningscall.api).API_BASE == "https://api.earningscall.dev" + + +def test_api_base_can_be_overridden_with_env_var(monkeypatch): + monkeypatch.setenv("EARNINGSCALL_API_BASE", "https://staging.example.com") + try: + assert importlib.reload(earningscall.api).API_BASE == "https://staging.example.com" + finally: + monkeypatch.delenv("EARNINGSCALL_API_BASE") + importlib.reload(earningscall.api) + + +@responses.activate +def test_requests_pin_api_schema_version(setup_api): + # Both the uncached path (events) and the cached path (symbols) must send the header. + responses.add(responses.GET, f"{API_BASE}/events", json={"company_name": "Apple Inc.", "events": []}) + responses.add(responses.GET, f"{API_BASE}/symbols-v2.txt", body="") + get_events("NASDAQ", "AAPL") + get_symbols_v2() + assert len(responses.calls) == 2 + for call in responses.calls: + assert call.request.headers["X-API-Version-Schema"] == "v4" + + +@responses.activate +def test_invalid_api_key_error_links_to_api_key_page(setup_api): + responses.add(responses.GET, f"{API_BASE}/events", status=401) + with pytest.raises(InvalidApiKeyError, match=re.escape(f"https://{DOMAIN}/api-key")): + get_events("NASDAQ", "AAPL") + + +@pytest.fixture() +def sleeps(monkeypatch): + """Record requested sleep durations instead of sleeping.""" + calls = [] + monkeypatch.setattr(earningscall.api.time, "sleep", calls.append) + return calls + + +@pytest.fixture() +def retry_three_times(setup_api): + earningscall.retry_strategy = { + "strategy": "exponential", + "base_delay": 0.01, + "max_attempts": 3, + } + + +@pytest.mark.parametrize("status", [429, 503]) +@responses.activate +def test_retry_waits_for_retry_after_seconds(retry_three_times, sleeps, status): + responses.add(responses.GET, f"{API_BASE}/events", status=status, headers={"Retry-After": "7"}) + responses.add(responses.GET, f"{API_BASE}/events", json={"company_name": "Apple Inc.", "events": []}) + assert get_events("NASDAQ", "AAPL") == {"company_name": "Apple Inc.", "events": []} + assert sleeps == [7.0] + + +@responses.activate +def test_retry_waits_until_retry_after_http_date(retry_three_times, sleeps): + retry_at = datetime.now(timezone.utc) + timedelta(seconds=30) + responses.add( + responses.GET, + f"{API_BASE}/events", + status=429, + headers={"Retry-After": email.utils.format_datetime(retry_at, usegmt=True)}, + ) + responses.add(responses.GET, f"{API_BASE}/events", json={"company_name": "Apple Inc.", "events": []}) + get_events("NASDAQ", "AAPL") + assert len(sleeps) == 1 + assert 25 <= sleeps[0] <= 30 + + +@responses.activate +def test_retry_falls_back_to_backoff_without_retry_after(retry_three_times, sleeps): + responses.add(responses.GET, f"{API_BASE}/events", status=429) + responses.add(responses.GET, f"{API_BASE}/events", status=429) + responses.add(responses.GET, f"{API_BASE}/events", json={"company_name": "Apple Inc.", "events": []}) + get_events("NASDAQ", "AAPL") + assert sleeps == [0.01, 0.02] + + +@responses.activate +def test_retry_gives_up_after_max_attempts(retry_three_times, sleeps): + responses.add(responses.GET, f"{API_BASE}/events", status=429, headers={"Retry-After": "1"}) + with pytest.raises(requests.HTTPError, match="429 Client Error"): + get_events("NASDAQ", "AAPL") + # No sleep after the final attempt + assert sleeps == [1.0, 1.0] + assert len(responses.calls) == 3 + + +@pytest.mark.parametrize( + "header, expected", + [ + (None, None), + ("", None), + ("not-a-date", None), + ("0", 0.0), + ("1.5", 1.5), + ("-5", 0.0), + ("Wed, 21 Oct 2015 07:28:00 GMT", 0.0), # In the past + ], +) +def test_get_retry_after_seconds(header, expected): + response = requests.Response() + if header is not None: + response.headers["Retry-After"] = header + assert get_retry_after_seconds(response) == expected diff --git a/tests/test_download_audio_files.py b/tests/test_download_audio_files.py index 2ebefc1..30aacfe 100644 --- a/tests/test_download_audio_files.py +++ b/tests/test_download_audio_files.py @@ -6,7 +6,7 @@ import earningscall from earningscall import get_company -from earningscall.api import purge_cache +from earningscall.api import API_BASE, purge_cache from earningscall.company import Company from earningscall.errors import InsufficientApiAccessError from earningscall.event import EarningsEvent @@ -119,3 +119,14 @@ def test_download_audio_file_500_error(): company = get_company("meta") with pytest.raises(HTTPError): company.download_audio_file(year=2024, quarter=3) + + +@responses.activate +def test_download_audio_file_not_authorized_with_plan_type_header(): + # api.earningscall.dev sends X-Plan-Type instead of X-Plan-Name + responses._add_from_file(file_path=data_path("symbols-v2.yaml")) + responses.add(responses.GET, f"{API_BASE}/audio", status=403, headers={"X-Plan-Type": "starter"}) + ## + company = get_company("meta") + with pytest.raises(InsufficientApiAccessError, match=r"Your plan \(starter\) does not include Audio Files"): + company.download_audio_file(year=2024, quarter=3) diff --git a/tests/test_download_slide_decks.py b/tests/test_download_slide_decks.py index c5d92c3..fa78a3c 100644 --- a/tests/test_download_slide_decks.py +++ b/tests/test_download_slide_decks.py @@ -6,7 +6,7 @@ import earningscall from earningscall import get_company -from earningscall.api import purge_cache +from earningscall.api import API_BASE, purge_cache from earningscall.company import Company from earningscall.errors import InsufficientApiAccessError from earningscall.event import EarningsEvent @@ -145,3 +145,14 @@ def test_download_slide_deck_custom_filename(): with open(file_name, 'rb') as f: assert f.read(4) == b'%PDF' os.unlink(file_name) + + +@responses.activate +def test_download_slide_deck_not_authorized_with_plan_type_header(): + # api.earningscall.dev sends X-Plan-Type instead of X-Plan-Name + responses._add_from_file(file_path=data_path("symbols-v2.yaml")) + responses.add(responses.GET, f"{API_BASE}/slides", status=403, headers={"X-Plan-Type": "starter"}) + ## + company = get_company("meta") + with pytest.raises(InsufficientApiAccessError, match=r"Your plan \(starter\) does not include Slide Decks"): + company.download_slide_deck(year=2024, quarter=3) diff --git a/tests/test_get_calendar.py b/tests/test_get_calendar.py index c3966f4..acbaae1 100644 --- a/tests/test_get_calendar.py +++ b/tests/test_get_calendar.py @@ -16,7 +16,7 @@ # import earningscall # @_recorder.record(file_path="data/get-calendar-not-found-response.yaml") # def test_save_symbols_v1(): -# requests.get("https://v2.api.earningscall.biz/calendar?apikey=demo&year=1980&month=1&day=1") +# requests.get("https://api.earningscall.dev/calendar?apikey=demo&year=1980&month=1&day=1") @pytest.fixture(autouse=True) @@ -72,6 +72,21 @@ def test_get_calendar_success(): assert calendar[0].company_name == "Motorcar Parts of America, Inc." +@responses.activate +def test_get_calendar_schema_v4_success(): + # Schema v4 wraps the calendar events as {"events": [...]} + responses._add_from_file(file_path=data_path("get-calendar-schema-v4-response.yaml")) + calendar = get_calendar(date(2025, 1, 10)) + assert len(calendar) == 16 + assert calendar[0].exchange == "OTC" + assert calendar[0].symbol == "TKUGF" + assert calendar[0].year == 2024 + assert calendar[0].quarter == 3 + assert calendar[0].conference_date.isoformat() == "2025-01-10T00:00:00-05:00" + assert not calendar[0].transcript_ready + assert calendar[0].company_name == "Takeuchi Mfg Co Ltd" + + @responses.activate def test_get_calendar_success_with_datetime(): earningscall.api_key = "XXXXXXXXXXX" diff --git a/tests/test_get_company_events.py b/tests/test_get_company_events.py index f1db40d..ea842d6 100644 --- a/tests/test_get_company_events.py +++ b/tests/test_get_company_events.py @@ -13,7 +13,7 @@ # from responses import _recorder # @_recorder.record(file_path="msft-company-events.yaml") # def test_save_symbols_v1(): -# requests.get("https://v2.api.earningscall.biz/events?apikey=demo&exchange=NASDAQ&symbol=MSFT") +# requests.get("https://api.earningscall.dev/events?apikey=demo&exchange=NASDAQ&symbol=MSFT") # diff --git a/tests/test_get_sp500_companies_api.py b/tests/test_get_sp500_companies_api.py index 6284515..8c85781 100644 --- a/tests/test_get_sp500_companies_api.py +++ b/tests/test_get_sp500_companies_api.py @@ -12,7 +12,7 @@ def test_load_sp500_tickers(): ## responses.add( responses.GET, - "https://v2.api.earningscall.biz/symbols/sp500.txt?apikey=demo", + "https://api.earningscall.dev/symbols/sp500.txt?apikey=demo", body="AAPL\nMSFT\nTSLA", status=200, adding_headers={ @@ -21,7 +21,7 @@ def test_load_sp500_tickers(): ) responses.add( responses.GET, - "https://v2.api.earningscall.biz/symbols/sp500.txt?apikey=demo", + "https://api.earningscall.dev/symbols/sp500.txt?apikey=demo", body="AAPL\nMSFT\nTSLA\nNEWCOMPANY", status=200, adding_headers={ @@ -32,8 +32,8 @@ def test_load_sp500_tickers(): sp500_raw_text = get_sp500_companies_txt_file() ## assert len(responses.calls) == 1 - assert responses.calls[0].request.url == "https://v2.api.earningscall.biz/symbols/sp500.txt?apikey=demo" - assert cached_urls() == ["https://v2.api.earningscall.biz/symbols/sp500.txt?apikey=demo"] + assert responses.calls[0].request.url == "https://api.earningscall.dev/symbols/sp500.txt?apikey=demo" + assert cached_urls() == ["https://api.earningscall.dev/symbols/sp500.txt?apikey=demo"] tickers = [ticker_symbol for ticker_symbol in sp500_raw_text.split("\n")] assert tickers == ["AAPL", "MSFT", "TSLA"] ## @@ -42,9 +42,9 @@ def test_load_sp500_tickers(): sp500_raw_text = get_sp500_companies_txt_file() ## assert len(responses.calls) == 1 - assert responses.calls[0].request.url == "https://v2.api.earningscall.biz/symbols/sp500.txt?apikey=demo" + assert responses.calls[0].request.url == "https://api.earningscall.dev/symbols/sp500.txt?apikey=demo" urls = cached_urls() - assert urls == ["https://v2.api.earningscall.biz/symbols/sp500.txt?apikey=demo"] + assert urls == ["https://api.earningscall.dev/symbols/sp500.txt?apikey=demo"] tickers = [ticker_symbol for ticker_symbol in sp500_raw_text.split("\n")] assert tickers == ["AAPL", "MSFT", "TSLA"] ## @@ -55,8 +55,8 @@ def test_load_sp500_tickers(): sp500_raw_text = get_sp500_companies_txt_file() ## assert len(responses.calls) == 2 - assert responses.calls[0].request.url == "https://v2.api.earningscall.biz/symbols/sp500.txt?apikey=demo" - assert responses.calls[1].request.url == "https://v2.api.earningscall.biz/symbols/sp500.txt?apikey=demo" - assert cached_urls() == ["https://v2.api.earningscall.biz/symbols/sp500.txt?apikey=demo"] + assert responses.calls[0].request.url == "https://api.earningscall.dev/symbols/sp500.txt?apikey=demo" + assert responses.calls[1].request.url == "https://api.earningscall.dev/symbols/sp500.txt?apikey=demo" + assert cached_urls() == ["https://api.earningscall.dev/symbols/sp500.txt?apikey=demo"] tickers = [ticker_symbol for ticker_symbol in sp500_raw_text.split("\n")] assert tickers == ["AAPL", "MSFT", "TSLA", "NEWCOMPANY"] diff --git a/tests/test_get_transcript.py b/tests/test_get_transcript.py index b48ab83..28f6851 100644 --- a/tests/test_get_transcript.py +++ b/tests/test_get_transcript.py @@ -11,7 +11,7 @@ from earningscall.errors import InsufficientApiAccessError, InvalidApiKeyError from earningscall.event import EarningsEvent from earningscall.symbols import clear_symbols, CompanyInfo -from earningscall.transcript import Transcript +from earningscall.transcript import Transcript, normalize_transcript_payload from earningscall.utils import data_path # Uncomment and run following code to generate msft-transcript-response.yaml file @@ -19,7 +19,7 @@ # from responses import _recorder # @_recorder.record(file_path="msft-transcript-response.yaml") # def test_save_symbols_v1(): -# requests.get("https://v2.api.earningscall.biz/transcript?apikey=demo&exchange=NASDAQ&symbol=MSFT&year=2023&quarter=1") +# requests.get("https://api.earningscall.dev/transcript?apikey=demo&exchange=NASDAQ&symbol=MSFT&year=2023&quarter=1") @pytest.fixture(autouse=True) @@ -148,6 +148,106 @@ def test_get_demo_company_with_speaker_name_map_v2(): assert transcript.speaker_name_map_v2["spk01"].title == "CEO" +@responses.activate +def test_get_transcript_schema_v4_level_2(): + ## + responses._add_from_file(file_path=data_path("symbols-v2.yaml")) + responses._add_from_file(file_path=data_path("aapl-q1-2023-level-2-schema-v4.yaml")) + ## + company = get_company("aapl") + ## + transcript = company.get_transcript(year=2023, quarter=1, level=2) + ## + assert responses.calls[-1].request.headers["X-API-Version-Schema"] == "v4" + assert transcript.event.year == 2023 + assert transcript.event.quarter == 1 + assert transcript.event.conference_date.isoformat() == "2023-02-02T17:00:00-05:00" + assert transcript.text[:100] == ( + "Good day, everyone, and welcome to the Apple Q1 Fiscal Year 2023 Earnings Conference Call. Today's c" + ) + assert transcript.speakers[0].speaker == "spk12" + assert transcript.speakers[0].speaker_info.name == "Teja Skala" + assert transcript.speakers[0].speaker_info.title == "Director of Investor Relations and Corporate Finance" + assert transcript.speakers[0].words is None + assert transcript.speaker_name_map_v2["spk01"].name == "Tim Cook" + assert transcript.speaker_name_map_v2["spk01"].title == "CEO" + + +@responses.activate +def test_get_transcript_schema_v4_level_3(): + ## + responses._add_from_file(file_path=data_path("symbols-v2.yaml")) + responses._add_from_file(file_path=data_path("aapl-q1-2023-level-3-schema-v4.yaml")) + ## + company = get_company("aapl") + ## + transcript = company.get_transcript(year=2023, quarter=1, level=3) + ## + speaker = transcript.speakers[0] + assert speaker.speaker == "spk12" + assert speaker.speaker_info.name == "Teja Skala" + assert len(speaker.words) == len(speaker.start_times) + assert speaker.text == " ".join(speaker.words) + assert transcript.text.startswith("Good day, everyone, and welcome to the Apple Q1 Fiscal Year 2023") + + +def _get_aapl_q1_2023_level_2_transcript(fixture_file_name: str) -> Transcript: + with responses.RequestsMock(assert_all_requests_are_fired=False) as mock: + mock._add_from_file(file_path=data_path("symbols-v2.yaml")) + mock._add_from_file(file_path=data_path(fixture_file_name)) + clear_symbols() + company = get_company("aapl") + assert company + transcript = company.get_transcript(year=2023, quarter=1, level=2) + assert transcript + return transcript + + +def test_get_transcript_schema_v4_matches_v2(): + v2_transcript = _get_aapl_q1_2023_level_2_transcript("aapl-q1-2022-speaker-name-map-v2.yaml") + v4_transcript = _get_aapl_q1_2023_level_2_transcript("aapl-q1-2023-level-2-schema-v4.yaml") + ## + assert v4_transcript.text == v2_transcript.text + assert v4_transcript.event == v2_transcript.event + assert v4_transcript.speakers == v2_transcript.speakers + assert v4_transcript.speaker_name_map_v2 == v2_transcript.speaker_name_map_v2 + + +def test_normalize_transcript_payload_leaves_v2_payload_unchanged(): + payload = { + "speakers": [{"speaker": "spk01", "text": "Hello."}], + "speaker_name_map_v2": {"spk01": {"name": "Tim Cook", "title": "CEO"}}, + } + assert normalize_transcript_payload(payload) is payload + + +def test_normalize_transcript_payload_leaves_payload_without_speakers_unchanged(): + payload = {"text": "Hello."} + assert normalize_transcript_payload(payload) is payload + + +def test_normalize_transcript_payload_converts_v4_speakers(): + payload = { + "speakers": [ + {"speaker": {"id": "spk01", "name": "Tim Cook", "title": "CEO"}, "text": "Hello."}, + {"speaker": {"id": "spk02", "name": "Operator"}, "text": "First question."}, + {"speaker": {"id": "spk01", "name": "Tim Cook", "title": "CEO"}, "text": "Thanks."}, + ], + } + ## + normalized = normalize_transcript_payload(payload) + ## + assert [speaker["speaker"] for speaker in normalized["speakers"]] == ["spk01", "spk02", "spk01"] + assert [speaker["text"] for speaker in normalized["speakers"]] == ["Hello.", "First question.", "Thanks."] + assert normalized["speaker_name_map_v2"] == { + "spk01": {"name": "Tim Cook", "title": "CEO"}, + "spk02": {"name": "Operator", "title": None}, + } + # The input payload is not mutated + assert payload["speakers"][0]["speaker"] == {"id": "spk01", "name": "Tim Cook", "title": "CEO"} + assert "speaker_name_map_v2" not in payload + + @responses.activate def test_get_demo_company_with_advanced_transcript_data_level_3(): ## @@ -311,14 +411,14 @@ def test_get_transcript_with_rate_limit_backoff_and_retry(): # First response responses.add( responses.GET, - "https://v2.api.earningscall.biz/transcript?apikey=demo&exchange=NASDAQ&symbol=AAPL&year=2023&quarter=1&level=1", + "https://api.earningscall.dev/transcript?apikey=demo&exchange=NASDAQ&symbol=AAPL&year=2023&quarter=1&level=1", body=json.dumps({"error": "Rate limit exceeded"}), status=429, ) # Second response responses.add( responses.GET, - "https://v2.api.earningscall.biz/transcript?apikey=demo&exchange=NASDAQ&symbol=AAPL&year=2023&quarter=1&level=1", + "https://api.earningscall.dev/transcript?apikey=demo&exchange=NASDAQ&symbol=AAPL&year=2023&quarter=1&level=1", body=json.dumps({"text": "Hello, world!"}), status=200, ) @@ -337,7 +437,7 @@ def test_get_transcript_fails_all_attempts(): # Always throttle the caller responses.add( responses.GET, - "https://v2.api.earningscall.biz/transcript?apikey=demo&exchange=NASDAQ&symbol=AAPL&year=2023&quarter=1&level=1", + "https://api.earningscall.dev/transcript?apikey=demo&exchange=NASDAQ&symbol=AAPL&year=2023&quarter=1&level=1", body=json.dumps({"error": "Rate limit exceeded"}), status=429, ) @@ -360,7 +460,7 @@ def test_get_transcript_fails_all_attempts_linear_retry_strategy(): # Always throttle the caller responses.add( responses.GET, - "https://v2.api.earningscall.biz/transcript?apikey=demo&exchange=NASDAQ&symbol=AAPL&year=2023&quarter=1&level=1", + "https://api.earningscall.dev/transcript?apikey=demo&exchange=NASDAQ&symbol=AAPL&year=2023&quarter=1&level=1", body=json.dumps({"error": "Rate limit exceeded"}), status=429, ) @@ -383,7 +483,7 @@ def test_get_transcript_fails_all_attempts_invalid_retry_strategy(): # Always throttle the caller responses.add( responses.GET, - "https://v2.api.earningscall.biz/transcript?apikey=demo&exchange=NASDAQ&symbol=AAPL&year=2023&quarter=1&level=1", + "https://api.earningscall.dev/transcript?apikey=demo&exchange=NASDAQ&symbol=AAPL&year=2023&quarter=1&level=1", body=json.dumps({"error": "Rate limit exceeded"}), status=429, ) @@ -399,7 +499,7 @@ def test_get_company_fails_not_authorized(): # Always throttle the caller responses.add( responses.GET, - "https://v2.api.earningscall.biz/symbols-v2.txt", + "https://api.earningscall.dev/symbols-v2.txt", body=json.dumps({"error": "Not authorized"}), status=401, ) @@ -417,7 +517,7 @@ def test_get_company_fails_not_authorized(): # # @_recorder.record(file_path="data/nvda-q2-2025-level-4-data-missing.yaml") # def test_save_symbols_v1_first(): -# requests.get("https://v2.api.earningscall.biz/transcript?apikey=demo&exchange=NASDAQ&symbol=NVDA&year=2025&quarter=2&level=4") +# requests.get("https://api.earningscall.dev/transcript?apikey=demo&exchange=NASDAQ&symbol=NVDA&year=2025&quarter=2&level=4") # Uncomment and run following code to generate demo-symbols-v2.yaml file @@ -429,5 +529,5 @@ def test_get_company_fails_not_authorized(): # @_recorder.record(file_path="data/aapl-q1-2030-not-found.yaml") # def test_save_symbols_v1_second(): # requests.get( -# "https://v2.api.earningscall.biz/transcript?apikey=demo&exchange=NASDAQ&symbol=AAPL&year=2030&quarter=1&level=1" +# "https://api.earningscall.dev/transcript?apikey=demo&exchange=NASDAQ&symbol=AAPL&year=2030&quarter=1&level=1" # ) diff --git a/tests/test_symbols.py b/tests/test_symbols.py index 375bea4..5c25ff6 100644 --- a/tests/test_symbols.py +++ b/tests/test_symbols.py @@ -33,7 +33,7 @@ def test_load_symbols_txt_v2(): assert _symbol.sector == "Technology" assert _symbol.industry == "Consumer Electronics" assert len(responses.calls) == 1 - assert responses.calls[0].request.url == "https://v2.api.earningscall.biz/symbols-v2.txt?apikey=demo" + assert responses.calls[0].request.url == "https://api.earningscall.dev/symbols-v2.txt?apikey=demo" ## symbols.remove_exchange_symbol("NASDAQ_AAPL") with pytest.raises(KeyError): @@ -60,7 +60,7 @@ def test_load_symbols_txt_v2_missing_edge_cases(): assert _symbol.sector == "Consumer Defensive" assert _symbol.industry == "Education & Training Services" assert len(responses.calls) == 1 - assert responses.calls[0].request.url == "https://v2.api.earningscall.biz/symbols-v2.txt?apikey=demo" + assert responses.calls[0].request.url == "https://api.earningscall.dev/symbols-v2.txt?apikey=demo" def test_symbols_serialization_to_text_v2(): From d8195d43d376b9f15f45b1ee4a09dd5a0679081b Mon Sep 17 00:00:00 2001 From: EarningsCall Date: Sun, 18 Oct 2026 14:31:06 -0500 Subject: [PATCH 2/2] fix: harden Retry-After parsing and restore coverage Address CodeRabbit review on #49: - float() accepts "inf"/"nan" (and "1e400" overflows to inf), which time.sleep() rejects with OverflowError/ValueError and aborted the retry. Treat non-finite values as missing so the backoff applies. - asctime-format and "-0000" HTTP dates parse to naive datetimes, so subtracting the aware current time raised TypeError. HTTP dates are always GMT, so treat them as UTC. Coveralls reported -0.2%: _plan_name(None) and normalizing a v4 payload that also contains a speaker id string were untested. Cover both. Co-Authored-By: Claude Opus 5.5 --- earningscall/api.py | 9 ++++++++- tests/test_api.py | 20 ++++++++++++++++++++ tests/test_company.py | 25 ++++++++++++++++++++++++- tests/test_get_transcript.py | 18 ++++++++++++++++++ 4 files changed, 70 insertions(+), 2 deletions(-) diff --git a/earningscall/api.py b/earningscall/api.py index 273aba9..024382e 100644 --- a/earningscall/api.py +++ b/earningscall/api.py @@ -1,6 +1,7 @@ import email.utils import importlib.metadata import logging +import math import os import platform import time @@ -123,13 +124,19 @@ def get_retry_after_seconds(response: requests.Response) -> Optional[float]: if not retry_after: return None try: - return max(float(retry_after), 0.0) + seconds = float(retry_after) except ValueError: pass + else: + # float() also accepts "inf" and "nan", which time.sleep() rejects. + return max(seconds, 0.0) if math.isfinite(seconds) else None try: retry_at = email.utils.parsedate_to_datetime(retry_after) except (TypeError, ValueError): return None + if retry_at.tzinfo is None: + # HTTP dates are always GMT, but asctime-format and "-0000" dates parse without a timezone. + retry_at = retry_at.replace(tzinfo=timezone.utc) return max((retry_at - datetime.now(timezone.utc)).total_seconds(), 0.0) diff --git a/tests/test_api.py b/tests/test_api.py index e28e011..10f5086 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -311,7 +311,12 @@ def test_retry_gives_up_after_max_attempts(retry_three_times, sleeps): ("0", 0.0), ("1.5", 1.5), ("-5", 0.0), + ("inf", None), + ("nan", None), + ("1e400", None), # Overflows to inf ("Wed, 21 Oct 2015 07:28:00 GMT", 0.0), # In the past + ("Wed, 21 Oct 2015 07:28:00 -0000", 0.0), # Parses without a timezone + ("Wed Oct 21 07:28:00 2015", 0.0), # asctime format, parses without a timezone ], ) def test_get_retry_after_seconds(header, expected): @@ -319,3 +324,18 @@ def test_get_retry_after_seconds(header, expected): if header is not None: response.headers["Retry-After"] = header assert get_retry_after_seconds(response) == expected + + +def test_get_retry_after_seconds_treats_dates_without_timezone_as_gmt(): + retry_at = datetime.now(timezone.utc) + timedelta(seconds=30) + response = requests.Response() + response.headers["Retry-After"] = retry_at.strftime("%a %b %d %H:%M:%S %Y") # asctime format + assert 25 <= get_retry_after_seconds(response) <= 30 + + +@responses.activate +def test_retry_falls_back_to_backoff_for_non_finite_retry_after(retry_three_times, sleeps): + responses.add(responses.GET, f"{API_BASE}/events", status=429, headers={"Retry-After": "inf"}) + responses.add(responses.GET, f"{API_BASE}/events", json={"company_name": "Apple Inc.", "events": []}) + get_events("NASDAQ", "AAPL") + assert sleeps == [0.01] diff --git a/tests/test_company.py b/tests/test_company.py index 1a5bd2c..2af16b5 100644 --- a/tests/test_company.py +++ b/tests/test_company.py @@ -1,8 +1,9 @@ import json import pytest +import requests -from earningscall.company import Company +from earningscall.company import Company, _plan_name from earningscall.symbols import CompanyInfo @@ -32,3 +33,25 @@ def test_company_to_string(): } assert company_info.exchange_symbol() == "TEST_TEST" assert company_info.to_txt_row() == ["-1", "TEST", "Test Company"] + + +def _response_with_headers(headers: dict) -> requests.Response: + response = requests.Response() + response.headers.update(headers) + return response + + +@pytest.mark.parametrize( + "headers, expected", + [ + ({"X-Plan-Name": "basic", "X-Plan-Type": "starter"}, "basic"), + ({"X-Plan-Type": "starter"}, "starter"), + ({}, "unknown"), + ], +) +def test_plan_name(headers, expected): + assert _plan_name(_response_with_headers(headers)) == expected + + +def test_plan_name_without_response(): + assert _plan_name(None) == "unknown" diff --git a/tests/test_get_transcript.py b/tests/test_get_transcript.py index 28f6851..8ade981 100644 --- a/tests/test_get_transcript.py +++ b/tests/test_get_transcript.py @@ -248,6 +248,24 @@ def test_normalize_transcript_payload_converts_v4_speakers(): assert "speaker_name_map_v2" not in payload +def test_normalize_transcript_payload_keeps_speaker_ids_alongside_v4_speakers(): + payload = { + "speakers": [ + {"speaker": {"id": "spk01", "name": "Tim Cook", "title": "CEO"}, "text": "Hello."}, + {"speaker": "spk02", "text": "First question."}, + ], + "speaker_name_map_v2": {"spk02": {"name": "Operator", "title": None}}, + } + ## + normalized = normalize_transcript_payload(payload) + ## + assert [speaker["speaker"] for speaker in normalized["speakers"]] == ["spk01", "spk02"] + assert normalized["speaker_name_map_v2"] == { + "spk01": {"name": "Tim Cook", "title": "CEO"}, + "spk02": {"name": "Operator", "title": None}, + } + + @responses.activate def test_get_demo_company_with_advanced_transcript_data_level_3(): ##