PHPackages                             abromeit/gsc-api-client - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. abromeit/gsc-api-client

ActiveLibrary[API Development](/categories/api)

abromeit/gsc-api-client
=======================

A simple PHP class for the Google Search Console API (Client)

6181[1 issues](https://github.com/Abromeit/gsc-api-client/issues)PHP

Since Oct 11Pushed 7mo ago1 watchersCompare

[ Source](https://github.com/Abromeit/gsc-api-client)[ Packagist](https://packagist.org/packages/abromeit/gsc-api-client)[ RSS](/packages/abromeit-gsc-api-client/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependenciesVersions (1)Used By (0)

GSC API Client - A PHP Class for Easy-Peasy Data Retrieval from Google Search Console
=====================================================================================

[](#gsc-api-client---a-php-class-for-easy-peasy-data-retrieval-from-google-search-console)

A **PHP client** for the Google Search Console API that makes it easy to import search performance data programmatically into your application.

Table of Contents
-----------------

[](#table-of-contents)

- [Requirements](#requirements)
- [Installation](#installation)
- [API Reference](#api-reference)
- [Return Values](#return-values)
    - [Keyword Data Structure](#keyword-data-structure)
    - [URL Data Structure](#url-data-structure)
    - [URL + Keyword Data Structure](#url--keyword-data-structure)
    - [Search Performance by URL Data Structure](#search-performance-by-url-data-structure)
    - [Search Performance by Date Data Structure](#search-performance-by-date-data-structure)
- [Usage Examples](#usage-examples)
    - [Example Files](#example-files)
    - [Initialize the Client](#initialize-the-client)
    - [List Available Properties](#list-available-properties)
    - [Select a Property](#select-a-property)
    - [Set Date Range](#set-date-range)
    - [Configure Data Freshness](#configure-data-freshness)
    - [Get Search Performance Data](#get-search-performance-data)
    - [Configure Batch Processing](#configure-batch-processing)
    - [Accessing Returned Keyword Data](#accessing-returned-keyword-data)
    - [Accessing Returned URL Data](#accessing-returned-url-data)
    - [Accessing Returned Performance-by-Date Data](#accessing-returned-performance-by-date-data)
- [Speed and Resource Requirements](#speed-and-resource-requirements)
    - [Tested with Large-ish GSC Accounts](#tested-with-large-ish-gsc-accounts)
        - [Test Results](#test-results)
            - [Batch=1 (the long way round)](#batch1-the-long-way-round)
            - [Batch=10 (getting somewhere)](#batch10-getting-somewhere)
            - [Batch=1000 (now we're cooking)](#batch1000-now-were-cooking)
            - [How to find a good BatchSize](#how-to-find-a-good-batchsize)
    - [Real-World Performance Test](#real-world-performance-test)
- [Google's Table Schema](#googles-table-schema)
    - [Table `searchdata_site_impression`](#table-searchdata_site_impression)
    - [Table `searchdata_url_impression`](#table-searchdata_url_impression)
- [Additional Resources](#additional-resources)

Requirements
------------

[](#requirements)

Nothing fancy here:

- PHP 8.2+
- Google Search Console API credentials
- A GSC property that actually has some data in it

Installation
------------

[](#installation)

The GSC API Client is available as Composer package, which is most likely the easiest way to use this library.

So, to install it via Composer:

```
composer require abromeit/gsc-api-client:dev-main
```

Before you can start pulling data, you'll need to:

1. Set up a Google Cloud Project and enable the Search Console API
2. Create credentials (we use service accounts)
3. Download your JSON credentials file
4. Give your service account email access to your GSC properties

API Reference
-------------

[](#api-reference)

Here's everything you can do with the `GscApiClient` class.

Method SignatureReturn TypeDescription`__construct(Client $client)``void`Initializes a new GSC API client instance`getBatchSize()``int`Gets the current batch size setting`setBatchSize(int $batchSize)``self`Sets number of requests to batch (1-1000)`getProperties()``WmxSite[]`Gets all properties the user has access to`setProperty(string $siteUrl)``self`Sets the property to work with`getProperty()``string | null`Gets the currently set property URL`hasProperty()``bool`Checks if a property is set`isDomainProperty([?string $siteUrl=null])``bool`Checks if URL is a domain property`setStartDate(DateTimeInterface $date)``self`Sets the start date`setEndDate(DateTimeInterface $date)``self`Sets the end date`setDates(DateTimeInterface $startDate, DateTimeInterface $endDate)``self`Sets both start and end dates`clearStartDate()``self`Clears the start date`clearEndDate()``self`Clears the end date`clearDates()``self`Clears both dates`getStartDate()``DateTimeInterface | null`Gets the start date`getEndDate()``DateTimeInterface | null`Gets the end date`getDates()``array{start: DateTimeInterface | null, end: DateTimeInterface | null}`Gets both dates`hasStartDate()``bool`Checks if start date is set`hasEndDate()``bool`Checks if end date is set`hasDates()``bool`Checks if both dates are set`setCountry([?string $countryCode=null])``self`Sets country using ISO-3166-1-Alpha-3 code`getCountry()``string | null`Gets the current country`hasCountry()``bool`Checks if a country filter is set`setDevice([DeviceType|string|null $deviceType=null])``self`Sets device type`getDevice()``string | null`Gets the current device type`hasDevice()``bool`Checks if a device filter is set`setSearchType([?string $searchType=null])``self`Sets search type (e.g., 'WEB', 'NEWS')`getSearchType()``string | null`Gets the current search type`setDataState(?DataState $dataState)``self`Sets data state for fresh vs final data`getDataState()``DataState | null`Gets the current data state`getFirstDateWithData([?DateTimeInterface $startDate=null], [?DateTimeInterface $endDate=null])``DateTimeInterface | null`Gets the first date with available data`getNewApiDimensionFilterGroup(string $dimension, string $expression, [string $operator=\'equals\'])``ApiDimensionFilterGroup`Creates a dimension filter group for custom filtering`getTopKeywordsByDay([?int $maxRowsPerDay=null])``Generator`Gets top keywords by day`getTopUrlsByDay([?int $maxRowsPerDay=null])``Generator`Gets top URLs by day`getTopUrlsWithKeywordsByDay([?int $maxRowsPerDay=null])``Generator`Gets top URL + Keyword combinations by day`getSearchPerformanceByDate()``Generator`Gets aggregated search performance data by day`getSearchPerformanceByUrl()``Generator`Gets all available columns from `byPage` aggregated data sources`getRequestsPerSecond()``float`Gets the current average API queries per second`getTotalRequests()``int`Gets the total number of API queries madeReturn Values
-------------

[](#return-values)

The data structure matches [Google's BigQuery schema](#googles-table-schema) (thanks Google for at least being consistent here). If you're curious about the details:

### Keyword Data Structure

[](#keyword-data-structure)

Here's what you get for each keyword row:

```
/*  */
    [
        'data_date' => string,      // Format: YYYY-MM-DD
        'site_url' => string,       // Property URL
        'query' => string,          // Search query
        'impressions' => int,       // Total impressions
        'clicks' => int,            // Total clicks
        'position' => float,        // Average 1-based position
        'sum_top_position' => float // Sum of (position-1)*impressions
    ],
    // etc.
/*  */
```

### URL Data Structure

[](#url-data-structure)

Here is the actual return format for each row from `getTopUrlsByDay()`:

```
/*  */
    [
        'data_date' => string,      // Format: YYYY-MM-DD
        'site_url' => string,       // Property URL
        'url' => string,            // Page URL
        'impressions' => int,       // Total impressions
        'clicks' => int,            // Total clicks
        'position' => float,        // Average 1-based position
        'sum_top_position' => float // Sum of [zero based position]*impressions
    ]
/*  */
```

### URL + Keyword Data Structure

[](#url--keyword-data-structure)

Here is the return format for each row from `getTopUrlsWithKeywordsByDay()`:

```
/*  */
    [
        'data_date' => string,      // Format: YYYY-MM-DD
        'site_url' => string,       // Property URL
        'url' => string,            // Page URL
        'query' => string|null,     // Search query that led to the page (may be null)
        'impressions' => int,       // Total impressions
        'clicks' => int,            // Total clicks
        'position' => float,        // Average 1-based position
        'sum_top_position' => float // Sum of [zero based position]*impressions
    ]
/*  */
```

### Search Performance by Date Data Structure

[](#search-performance-by-date-data-structure)

Here is the result for `getSearchPerformanceByDate()`.

```
/*  */
    [
        'data_date' => string,      // Format: YYYY-MM-DD
        'site_url' => string,       // Property URL
        'impressions' => int,       // Total impressions
        'clicks' => int,            // Total clicks
        'position' => float,        // Average 1-based position
        'sum_top_position' => float // Sum of (position-1)*impressions
    ],
    // etc.
/*  */
```

### Search Performance by URL Data Structure

[](#search-performance-by-url-data-structure)

Here is the result for `getSearchPerformanceByUrl()`.

```
/*  */
    [
        'data_date' => string,         // Format: YYYY-MM-DD
        'site_url' => string,          // Property URL
        'url' => string,               // Page URL
        'query' => string,             // Search query that led to the page
        'country' => string,           // ISO-3166-1-Alpha-3 country code
        'device' => string,            // DESKTOP, MOBILE, or TABLET
        'impressions' => int,          // Total impressions
        'clicks' => int,               // Total clicks
        'position' => float,           // Average 1-based position
        'sum_top_position' => float    // Sum of [zero based position]*impressions
    ],
    // etc.
/*  */
```

Usage Examples
--------------

[](#usage-examples)

### Example Files

[](#example-files)

Check out these ready-to-use examples in the `examples/` directory:

- [`get-all-properties.php`](examples/get-all-properties.php) - List all GSC properties you have access to
- [`get-top3-keywords-per-day.php`](examples/get-top3-keywords-per-day.php) - Get the top 3 keywords for each day
- [`get-top3-urls-per-day.php`](examples/get-top3-urls-per-day.php) - Get the top 3 URLs for each day
- [`get-top3-urls-with-keywords-per-day.php`](examples/get-top3-urls-with-keywords-per-day.php) - Get the top 3 URL-Keyword combinations for each day

### Initialize the Client

[](#initialize-the-client)

```
use Abromeit\GscApiClient\GscApiClient;
use Google\Client;
use Google\Service\SearchConsole;

// Initialize with service account
$googleClient = new Client();
$googleClient->setAuthConfig('/path/to/service-account.json');
$googleClient->addScope(SearchConsole::WEBMASTERS_READONLY);

$apiClient = new GscApiClient($googleClient);
```

### List Available Properties

[](#list-available-properties)

Want to see what properties you have access to? Easy:

```
$properties = $apiClient->getProperties();
foreach ($properties as $property) {
    echo $property->getSiteUrl() . "\n";
    echo "Permission Level: " . $property->getPermissionLevel() . "\n";
}
```

### Select a Property

[](#select-a-property)

Pick your poison:

```
// Using URL
$apiClient->setProperty('https://example.com/');

// Using domain property
$apiClient->setProperty('sc-domain:example.com');
```

### Set Date Range

[](#set-date-range)

Need last week's data? Got you covered:

```
// Last 7 days
$startDate = (new DateTime('today'))->sub(new DateInterval('P7D'));
$endDate = new DateTime('today');
$apiClient->setDates($startDate, $endDate);

// Or if you need specific dates
$apiClient->setDates(
    new DateTime('2024-01-01'),
    new DateTime('2024-01-31')
);
```

### Configure Data Freshness

[](#configure-data-freshness)

By default, the GSC API returns only final/complete data. But sometimes you want the freshest data available, even if it's still being processed in GSC. Here's how:

```
use Abromeit\GscApiClient\Enums\GSCDataState as DataState;

// Get only final/complete data (default behavior)
$apiClient->setDataState(DataState::FINAL);

// Get fresh data including incomplete/current data
$apiClient->setDataState(DataState::ALL);

// Reset to API default (final data only)
$apiClient->setDataState(null);
```

**Important:** Fresh data (`ALL`) may be incomplete and can change as Google continues processing. It's perfect for real-time dashboards but use with caution for final reports.

**Note:** `DataState::HOURLY_ALL` is also available for hourly data breakdown, but is currently **untested**. Some internal functions use daily-only time ranges which may not work correctly with hourly data states.

### Get Search Performance Data

[](#get-search-performance-data)

Aaand here's where the magic happens:

```
// Get daily keyword performance data
$keywordData = $apiClient->getTopKeywordsByDay();

// Get daily performance data with allover sums of clicks, imressions, etc.
// Including those of anyonymized queries.
// By default, the output matches the chart data of the unfiltered
// https://search.google.com/search-console/performance/search-analytics?resource_id=[YOUR-PROPERTY-NAME]&breakdown=date
$dailyPerformance = $apiClient->getSearchPerformanceByDate();

// Get daily URL performance data (max 25k rows per request)
$urlData = $apiClient->getTopUrlsByDay();

// Want fewer rows? No problem
$keywordData = $apiClient->getTopKeywordsByDay(100);
$urlData = $apiClient->getTopUrlsByDay(10);

// Get search performance data with as many details as possible
$performanceData = $apiClient->getSearchPerformanceByUrl();

// Filter by country (ISO-3166-1-Alpha-3, because apparently ISO codes weren't confusing enough)
$apiClient->setCountry('USA');

// Filter by device type (DESKTOP, MOBILE, TABLET)
$apiClient->setDevice(\Abromeit\GscApiClient\Enums\GSCDeviceType::MOBILE);
// or just
$apiClient->setDevice('MOBILE');

// Clear individual filters
$apiClient->setCountry(null);
$apiClient->setDevice(null);
$apiClient->setSearchType(null);

// Create custom dimension filters
$queryFilter = $apiClient->getNewApiDimensionFilterGroup('query', 'foo bar'); // "query = foo bar"
$queryFilter = $apiClient->getNewApiDimensionFilterGroup('query', 'foo bar', 'contains'); // "query *= foo bar"
```

### Configure Batch Processing

[](#configure-batch-processing)

See

```
// Get current batch size
$batchSize = $apiClient->getBatchSize();

// Set number of requests to batch together (1-1000)
// Pro tip: Set this BEFORE calling methods that hit the API >.getTopKeywordsByDay();

foreach ($keywordData as $row) {
    echo "Date: {$row['data_date']}\n";
    echo "Query: {$row['query']}\n";
    echo "Position: ".number_format($row['position'], 1)."\n";
    echo "Clicks: {$row['clicks']}\n";
    echo "Impressions: {$row['impressions']}\n";
    echo "Sum Top Position: {$row['sum_top_position']}\n";
}
```

### Accessing Returned URL Data

[](#accessing-returned-url-data)

Same assoc result array, but for URLs:

```
$urlData = $apiClient->getTopUrlsByDay();

foreach ($urlData as $row) {
    echo "Date: {$row['data_date']}\n";
    echo "URL: {$row['url']}\n";
    echo "Position: ".number_format($row['position'], 1)."\n";
    echo "Clicks: {$row['clicks']}\n";
    echo "Impressions: {$row['impressions']}\n";
    echo "Sum Top Position: {$row['sum_top_position']}\n";
}
```

### Accessing Returned Performance-by-Date Data

[](#accessing-returned-performance-by-date-data)

```
$dailyData = $apiClient->getSearchPerformanceByDate();

foreach ($dailyData as $row) {
    echo "Date: {$row['data_date']}\n";
    echo "Clicks: {$row['clicks']}\n";
    echo "Impressions: {$row['impressions']}\n";
    echo "Position: ".number_format($row['position'], 1)."\n";
}
```

Speed and Resource Requirements
-------------------------------

[](#speed-and-resource-requirements)

We've updated the GSC API Client to use a yield-style implementation because waiting for the entire dataset to load before processing is no fun. Here's what you get:

- Data starts flowing as soon as it's available *(effectively **streaming** it)*
- The BatchSize config option now allows us to choose of either speed or memory efficiency. *(I'd love to say "and any point in between", but in reality even small batch sizes can result in substantial HTTP response sizes. - which unsuprisingly affects the memory footprint our application has.)*

### Tested with Large-ish GSC Accounts

[](#tested-with-large-ish-gsc-accounts)

These numbers are from a local dev machine running who-knows-what in the background - so take them with a grain of salt. But you'll see the pattern.

We grabbed 16 months of daily data using `getTopKeywordsByDay()`. This function uses the "byProperty" aggregation, which seemingly means you get the top 5k entries (keywords) per day. (This behavior is only … "implicitly" documented. You'll most likely find numbers around 25k+ rows in the documentation. These exist, just not here.)

The result is 499 days of data in 2,495,000 rows. Each row contains a keyword with its `impressions`, `clicks`, and `ctr` for a single day.

#### Test Results

[](#test-results)

**NOTE: This data reflects a software version before the implementation of the ThrottlingMiddleware. Consequently, performance metrics may differ from the current version, which enforces API request limits.**

[![Terminal-rendered bar graphs of the GSC API Client's memory consumption and execution duration for different batch sizes and PHP implementation variants. (See table below for textual representation.)](docs/performance-comparison-gsc-api-with-generator-functions.png)](docs/performance-comparison-gsc-api-with-generator-functions.png)

ImplementationBatch SizePeak MemoryRuntimeArray-style11269 MB307s (5.1m)Yield-style145 MB (-96%)290s (4.8m)Yield-style586 MB188s (3.1m)Array-style101329 MB194s (3.2m)Yield-style10145 MB (-89%)183s (3.1m)Yield-style15205 MB189s (3.2m) // sic!Array-style10001917 MB36s (0.6m)Yield-style1000639 MB (-67%)38s (0.6m)##### Batch=1 (the long way round):

[](#batch1-the-long-way-round)

- One HTTP request per day = 498 separate, sequential connections with handshakes, headers, waiting for the response from google, the whole deal
- Array version: **1.2GB RAM**, 5.1min runtime *(congratulations, you now have time to check your unread emails)*
- Yield version: **45MB RAM**, but same glacial speed *(because physics)*

##### Batch=10 (getting somewhere):

[](#batch10-getting-somewhere)

- Runtime drops to ~3.2min by bundling into ~50 requests
- Memory stays manageable with yield (145MB)
- Array version still hoarding RAM like it's mining crypto (1.3GB)

##### Batch=1000 (now we're cooking):

[](#batch1000-now-were-cooking)

- 36-38 seconds runtime with just 1-2 connections total
- Memory jumps to 1.9GB array / 639MB yield
- If your server has the RAM, this is probably what you want, right?

##### How to find a good BatchSize

[](#how-to-find-a-good-batchsize)

The yield implementation keeps memory in check while matching speed. But note that Google enforces a per-site quota of `20 requests per second` = `120 api calls per minute` (see [Google's QPS Quota](https://developers.google.com/webmaster-tools/limits?hl=en#qps-quota)). Higher batch sizes will make you feel good about some measured metrics, but they're lying to you - the API is just dropping your requests.

**Stick to batch sizes below 20** unless you are fully aware of the implications, as exceeding the quota can lead to unnecessarily long runtimes. Which is the opposite of what you want.

##### Real-World Performance Test

[](#real-world-performance-test)

**NOTE: The following performance metrics reflect measurements taken with the "current" software version, which includes ThrottlingMiddleware for API request rate limiting. These results supersede the data shown above.**

Here is another test fetching 3 months of data using `getSearchPerformanceByUrl()` with various batch sizes. These are the results:

Batch SizeTotal RowsPeak MemoryAvg MemoryRuntimeRows/SecondQPS14,505,486118.1 MB85.4 MB491.6s9,1650.37204,505,486707.4 MB539.4 MB171.4s26,2831.07754,505,4861,362.2 MB1,017.3 MB150.3s29,9841.221754,505,4863,386.8 MB2,229.5 MB142.8s31,5471.29- 91 days of data (2024-11-06 to 2025-02-06)
- ~49,510 rows per day (min: 48,860, max: 49,772)
- Total data volume: 4.5M rows, ~1.2GB compressed JSON

Google's Table Schema
---------------------

[](#googles-table-schema)

Thinking about GSC data can be a real head-scratcher sometimes. At every corner, certain information might be missing or needs to be interpreted in a specific way to arrive at meaningful results. Fortunately, it helps to look at how Google itself handles the same data. *Ooo-wee!*

So - if you export your GSC data to BigQuery, you will find the following situation in the tables.

### Table `searchdata_site_impression`

[](#table-searchdata_site_impression)

This table contains data aggregated by property. The table contains the following fields:

FieldTypeDescriptiondata\_datestringThe day on which the data in this row was generated (Pacific Time).site\_urlstringURL of the property. For domain-level properties, this will be `sc-domain:property-name`. For URL-prefix properties, it will be the full URL of the property definition. Examples: `sc-domain:developers.google.com`, `https://developers.google.com/webmaster-tools/`.querystringThe user query. When `is_anonymized_query` is true, this will be a zero-length string.is\_anonymized\_querybooleanRare queries (called anonymized queries) are marked with this bool. The query field will be null when it's true to protect the privacy of users making the query.CountrystringCountry from where the query was made, in ISO-3166-1-Alpha-3 format.search\_typestringOne of the following string values: `web`, `image`, `video`, `news`, `discover`, `googleNews`.devicestringThe device from which the query was made.impressionsintegerThe number of impressions for this row.clicksintegerThe number of clicks for this row.sum\_top\_positionfloatThe sum of (position-1) \* impressions. Allows further aggregation of position data.positionfloatThe average 1-based position as reported directly by the GSC API.### Table `searchdata_url_impression`

[](#table-searchdata_url_impression)

This table contains data aggregated by URL. The table contains the following fields:

FieldTypeDescriptiondata\_datestringSame as above.site\_urlstringSame as above.urlstringThe fully-qualified URL where the user eventually lands when they click the search result or Discover story.querystringSame as above.is\_anonymized\_querybooleanSame as above.is\_anonymized\_discoverbooleanWhether the data row is under the Discover anonymization threshold. When under the threshold, some other fields (like URL and country) will be missing to protect user privacy.countrystringSame as above.search\_typestringSame as above.devicestringSame as above.is\_\[search\_appearance\_type\]booleanThere are several boolean fields used to indicate search appearance type, such as `is_amp_top_stories`, `is_job_listing`, and `is_job_details`. A field will be true if the row in question appears for the specific rich result.impressionsintegerSame as above.clicksintegerSame as above.sum\_positionfloatA zero-based number indicating the topmost position of this URL in the search results for the query. (Zero is the top position in the results.) To calculate average position (which is 1-based), calculate `SUM(sum_position)/SUM(impressions) + 1`.Additional Resources
--------------------

[](#additional-resources)

For more details on topics discussed in this GSC API Client's Readme file, refer to the official documentation and guidelines provided by Google:

- **Batch Requests:** [Google Search Console API Batch Requests](https://developers.google.com/webmaster-tools/v1/how-tos/batch?hl=en)
- **API Request Limits:** [Google Search Console API Limits and Quotas](https://developers.google.com/webmaster-tools/limits?hl=en#qps-quota)
- **Getting Started with the Search Console API:** [Quickstart - Search Console API](https://developers.google.com/webmaster-tools/v3/quickstart)
- **Setting Up Service Accounts:** [Using Service Accounts](https://developers.google.com/identity/protocols/oauth2/service-account)

###  Health Score

19

—

LowBetter than 10% of packages

Maintenance41

Moderate activity, may be stable

Popularity13

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity13

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

### Community

Maintainers

![](https://www.gravatar.com/avatar/5472eb5f4521201ae9b4762b2e2378c73cd4ecc07b4d699e81dc9d1a8a0c8a34?d=identicon)[abro](/maintainers/abro)

---

Top Contributors

[![Abromeit](https://avatars.githubusercontent.com/u/537920?v=4)](https://github.com/Abromeit "Abromeit (74 commits)")

---

Tags

api-clientapi-consumerbatchbatch-processingbatch-requestbatch-requestsclassgenerator-functionsgoogle-search-consolegoogle-search-console-apigoogle-webmaster-toolsgscmemory-optimizationphpphp8seoseo-apitechnical-seowebmaster-toolsyield

### Embed Badge

![Health badge](/badges/abromeit-gsc-api-client/health.svg)

```
[![Health](https://phpackages.com/badges/abromeit-gsc-api-client/health.svg)](https://phpackages.com/packages/abromeit-gsc-api-client)
```

###  Alternatives

[stripe/stripe-php

Stripe PHP Library

4.0k143.3M480](/packages/stripe-stripe-php)[twilio/sdk

A PHP wrapper for Twilio's API

1.6k92.9M272](/packages/twilio-sdk)[facebook/php-business-sdk

PHP SDK for Facebook Business

90821.9M34](/packages/facebook-php-business-sdk)[meilisearch/meilisearch-php

PHP wrapper for the Meilisearch API

74513.7M114](/packages/meilisearch-meilisearch-php)[google/gax

Google API Core for PHP

265103.1M454](/packages/google-gax)[google/common-protos

Google API Common Protos for PHP

173103.7M50](/packages/google-common-protos)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
