PHPackages                             particle-academy/youtube-php - 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. particle-academy/youtube-php

ActiveLibrary[API Development](/categories/api)

particle-academy/youtube-php
============================

YouTube for PHP — the service descriptor, its faker, its webhook verification, and one class per operation. Plain HTTP on particle-academy/fancy-connector-core; no vendor SDK.

v0.1.0(today)01↑2900%MITPythonPHP ^8.4CI passing

Since Aug 24Pushed todayCompare

[ Source](https://github.com/Fancy-Friends/youtube)[ Packagist](https://packagist.org/packages/particle-academy/youtube-php)[ Docs](https://github.com/Fancy-Friends/youtube)[ RSS](/packages/particle-academy-youtube-php/feed)WikiDiscussions main Synced today

READMEChangelogDependencies (3)Versions (2)Used By (0)

YouTube
=======

[](#youtube)

YouTube for [fancy-flow](https://github.com/Particle-Academy/fancy-flow) — as **four imported, versioned packages**, one per runtime. Not vendored source: a copy cannot be upgraded, and third-party APIs change.

RuntimePackageInstallAuthoring surface (every host)`@particle-academy/youtube-ui``npm install @particle-academy/youtube-ui`Node`@particle-academy/youtube-js``npm install @particle-academy/youtube-js`PHP 8.4+`particle-academy/youtube-php``composer require particle-academy/youtube-php`Python 3.11+`fancy-youtube``pip install fancy-youtube`The `ui` package is the editor surface and is React on every host — a PHP or Python project installs it *and* its own runtime package, and never the `js` one.

What it costs you
-----------------

[](#what-it-costs-you)

One dependency: `@particle-academy/fancy-connector-core` (or `particle-academy/fancy-connector-core` on Composer), which the `js` and `php`packages pull in themselves. The Python package has **zero** runtime dependencies.

**No YouTube SDK.** Plain HTTP, deliberately: a vendor SDK is third-party code subject to the kit's full approval bar, and one per provider is hundreds of dependencies nobody is tracking.

Setting it up
-------------

[](#setting-it-up)

Everything below is generated from `provider/manifest.json`, so it cannot disagree with what the packages do.

### Credentials

[](#credentials)

A YouTube connection holds 4 values.

**Two kinds of value, and mixing them up matters.** A `provider` credential is ONE value for the whole installation — an OAuth app's client secret serves every connected account. An `account` credential is one per connected account. A host that stores the second where it stores the first lets one account's credentials reach another's.

FieldScopeSecretWhere it comes from**OAuth client ID**per installationnot secretFrom Google Cloud Console. One value for the whole installation.**OAuth client secret**per installation**secret**The client secret for the same OAuth app.**Access token**per connected account**secret**Per connected YouTube account; expires after one hour.**Refresh token**per connected account**secret**Per connected YouTube account; the host uses it to refresh the access token.### Authorising

[](#authorising)

YouTube uses OAuth2 (authorization\_code). The package DECLARES the exchange; the HOST performs it — a consent screen needs a browser, a redirect URI and somewhere to persist the result, and all three belong to the host.

- **Authorize URL** —
- **Token URL** —
- **Scopes** — `https://www.googleapis.com/auth/youtube.force-ssl`
- **Access token lifetime** — 3600 seconds (1 hours). A host that never refreshes works all afternoon and is broken by morning.

The refresh tokens do **not** rotate: the same one is reusable, so a refresh may safely be retried and may run concurrently. Stated rather than assumed, because the opposite — a provider that spends the token and revokes the grant on a replay — looks identical until it happens.

### The estate

[](#the-estate)

**YouTube has no test estate, and somebody checked.** Everything this connector does is real. Use the faker to build against it.

> YouTube has no sandbox. Every live-mode add changes a real playlist; use the faker during development and remove live test items afterward.

What it can do
--------------

[](#what-it-can-do)

### Actions

[](#actions)

#### `playlist_item_insert` — YouTube playlist item

[](#playlist_item_insert--youtube-playlist-item)

Add a video to a YouTube playlist.

`POST /youtube/v3/playlistItems` · **unsafe to replay** — a retried durable run does it TWICE

InputRequiredWhat it is`playlistId`yesThe YouTube id of the playlist to add the video to.`videoId`yesThe YouTube id of the video to add.Run it before you have credentials
----------------------------------

[](#run-it-before-you-have-credentials)

Every operation ships a **faker**, whether or not YouTube has a sandbox. Set a node's mode to `fake` and it returns the shape YouTube actually publishes — the same field names, deterministically — so you can wire the downstream nodes before touching an account, a key, or a network.

This repository is generated
----------------------------

[](#this-repository-is-generated)

`provider/` is the source. Everything under `packages/` is emitted from it and **must not be hand-edited** — CI regenerates and diffs on every push, and the next protocol sync destroys anything it finds. See [`AGENTS.md`](AGENTS.md).

Two namespaces, which do not match on purpose
---------------------------------------------

[](#two-namespaces-which-do-not-match-on-purpose)

The repo is `github.com/Fancy-Friends/youtube`; the packages publish under `particle-academy`. Nothing derives one from the other — the names come from weaver's `friends.json` and nowhere else.

Licence
-------

[](#licence)

MIT.

###  Health Score

39

—

LowBetter than 84% of packages

Maintenance100

Actively maintained with recent releases

Popularity2

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity40

Maturing project, gaining track record

 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.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

0d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/461446?v=4)[Wish Born](/maintainers/wishborn)[@wishborn](https://github.com/wishborn)

---

Top Contributors

[![wishborn](https://avatars.githubusercontent.com/u/461446?v=4)](https://github.com/wishborn "wishborn (8 commits)")

---

Tags

apiyoutubeconnectormarketingparticle-academyfancy-ui

###  Code Quality

TestsPest

Code StyleLaravel Pint

### Embed Badge

![Health badge](/badges/particle-academy-youtube-php/health.svg)

```
[![Health](https://phpackages.com/badges/particle-academy-youtube-php/health.svg)](https://phpackages.com/packages/particle-academy-youtube-php)
```

###  Alternatives

[socialapis/youtubedownloader

A small project for fetching youtube vidoes with their private api.

251.4k](/packages/socialapis-youtubedownloader)

PHPackages © 2026

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