Skip to content

๐Ÿ—„ โฒ

๐Ÿ‘† ๐Ÿ’ช โœ ๐Ÿ› ๏ธ โฎ๏ธ โžก ๐Ÿ› ๏ธ ๐Ÿ‘ˆ ๐Ÿ’ช โฒ ๐Ÿ“จ ๐Ÿ”ข ๐Ÿ› ๏ธ โœ ๐Ÿ‘ฑ ๐Ÿ™† (๐ŸŽฒ ๐ŸŽ ๐Ÿ‘ฉโ€๐Ÿ’ป ๐Ÿ‘ˆ ๐Ÿ”œ โš™๏ธ ๐Ÿ‘† ๐Ÿ› ๏ธ).

๐Ÿ› ๏ธ ๐Ÿ‘ˆ ๐Ÿ”จ ๐Ÿ•โ” ๐Ÿ‘† ๐Ÿ› ๏ธ ๐Ÿ“ฑ ๐Ÿค™ ๐Ÿ”ข ๐Ÿ› ๏ธ ๐Ÿ“› "โฒ". โ†ฉ๏ธ ๐Ÿ–ฅ ๐Ÿ‘ˆ ๐Ÿ”ข ๐Ÿ‘ฉโ€๐Ÿ’ป โœ ๐Ÿ“จ ๐Ÿ“จ ๐Ÿ‘† ๐Ÿ› ๏ธ & โคด๏ธ ๐Ÿ‘† ๐Ÿ› ๏ธ ๐Ÿค™ ๐Ÿ”™, ๐Ÿ“จ ๐Ÿ“จ ๐Ÿ”ข ๐Ÿ› ๏ธ (๐Ÿ‘ˆ ๐ŸŽฒ โœ ๐ŸŽ ๐Ÿ‘ฉโ€๐Ÿ’ป).

๐Ÿ‘‰ ๐Ÿ’ผ, ๐Ÿ‘† ๐Ÿ’ช ๐Ÿ’š ๐Ÿ“„ โ” ๐Ÿ‘ˆ ๐Ÿ”ข ๐Ÿ› ๏ธ ๐Ÿ”œ ๐Ÿ‘€ ๐Ÿ’–. โšซ๏ธโ” โžก ๐Ÿ› ๏ธ โšซ๏ธ ๐Ÿ”œ โœ”๏ธ, โšซ๏ธโ” ๐Ÿ’ช โšซ๏ธ ๐Ÿ”œ โŒ›, โšซ๏ธโ” ๐Ÿ“จ โšซ๏ธ ๐Ÿ”œ ๐Ÿ“จ, โ™’๏ธ.

๐Ÿ“ฑ โฎ๏ธ โฒ

โžก๏ธ ๐Ÿ‘€ ๐ŸŒ ๐Ÿ‘‰ โฎ๏ธ ๐Ÿ–ผ.

๐ŸŒˆ ๐Ÿ‘† ๐Ÿ› ๏ธ ๐Ÿ“ฑ ๐Ÿ‘ˆ โœ” ๐Ÿ— ๐Ÿงพ.

๐Ÿ‘‰ ๐Ÿงพ ๐Ÿ”œ โœ”๏ธ id, title (๐Ÿ“ฆ), customer, & total.

๐Ÿ‘ฉโ€๐Ÿ’ป ๐Ÿ‘† ๐Ÿ› ๏ธ (๐Ÿ”ข ๐Ÿ‘ฉโ€๐Ÿ’ป) ๐Ÿ”œ โœ ๐Ÿงพ ๐Ÿ‘† ๐Ÿ› ๏ธ โฎ๏ธ ๐Ÿค ๐Ÿ“จ.

โคด๏ธ ๐Ÿ‘† ๐Ÿ› ๏ธ ๐Ÿ”œ (โžก๏ธ ๐ŸŒˆ):

  • ๐Ÿ“จ ๐Ÿงพ ๐Ÿ•ด ๐Ÿ”ข ๐Ÿ‘ฉโ€๐Ÿ’ป.
  • ๐Ÿ“ˆ ๐Ÿ’ธ.
  • ๐Ÿ“จ ๐Ÿ“จ ๐Ÿ”™ ๐Ÿ› ๏ธ ๐Ÿ‘ฉโ€๐Ÿ’ป (๐Ÿ”ข ๐Ÿ‘ฉโ€๐Ÿ’ป).
    • ๐Ÿ‘‰ ๐Ÿ”œ ๐Ÿ”จ ๐Ÿ“จ ๐Ÿค ๐Ÿ“จ (โšช๏ธโžก๏ธ ๐Ÿ‘† ๐Ÿ› ๏ธ) ๐Ÿ”ข ๐Ÿ› ๏ธ ๐Ÿšš ๐Ÿ‘ˆ ๐Ÿ”ข ๐Ÿ‘ฉโ€๐Ÿ’ป (๐Ÿ‘‰ "โฒ").

๐Ÿ˜ FastAPI ๐Ÿ“ฑ

โžก๏ธ ๐Ÿฅ‡ ๐Ÿ‘€ โ” ๐Ÿ˜ ๐Ÿ› ๏ธ ๐Ÿ“ฑ ๐Ÿ”œ ๐Ÿ‘€ ๐Ÿ’– โญ โŽ โฒ.

โšซ๏ธ ๐Ÿ”œ โœ”๏ธ โžก ๐Ÿ› ๏ธ ๐Ÿ‘ˆ ๐Ÿ”œ ๐Ÿ“จ Invoice ๐Ÿ’ช, & ๐Ÿ”ข ๐Ÿ”ข callback_url ๐Ÿ‘ˆ ๐Ÿ”œ ๐Ÿ”Œ ๐Ÿ“› โฒ.

๐Ÿ‘‰ ๐Ÿ• ๐Ÿ“ถ ๐Ÿ˜, ๐ŸŒ… ๐Ÿ“Ÿ ๐ŸŽฒ โช ๐Ÿ˜ฐ ๐Ÿ‘†:

from typing import Union

from fastapi import APIRouter, FastAPI
from pydantic import BaseModel, HttpUrl

app = FastAPI()


class Invoice(BaseModel):
    id: str
    title: Union[str, None] = None
    customer: str
    total: float


class InvoiceEvent(BaseModel):
    description: str
    paid: bool


class InvoiceEventReceived(BaseModel):
    ok: bool


invoices_callback_router = APIRouter()


@invoices_callback_router.post(
    "{$callback_url}/invoices/{$request.body.id}", response_model=InvoiceEventReceived
)
def invoice_notification(body: InvoiceEvent):
    pass


@app.post("/invoices/", callbacks=invoices_callback_router.routes)
def create_invoice(invoice: Invoice, callback_url: Union[HttpUrl, None] = None):
    """
    Create an invoice.

    This will (let's imagine) let the API user (some external developer) create an
    invoice.

    And this path operation will:

    * Send the invoice to the client.
    * Collect the money from the client.
    * Send a notification back to the API user (the external developer), as a callback.
        * At this point is that the API will somehow send a POST request to the
            external API with the notification of the invoice event
            (e.g. "payment successful").
    """
    # Send the invoice, collect the money, send the notification (the callback)
    return {"msg": "Invoice received"}

Tip

callback_url ๐Ÿ”ข ๐Ÿ”ข โš™๏ธ Pydantic ๐Ÿ“› ๐Ÿ†Ž.

๐Ÿ•ด ๐Ÿ†• ๐Ÿ‘œ callbacks=messages_callback_router.routes โŒ โžก ๐Ÿ› ๏ธ ๐Ÿ‘จโ€๐ŸŽจ. ๐Ÿ‘ฅ ๐Ÿ”œ ๐Ÿ‘€ โšซ๏ธโ” ๐Ÿ‘ˆ โญ.

๐Ÿ”ฌ โฒ

โ˜‘ โฒ ๐Ÿ“Ÿ ๐Ÿ”œ ๐Ÿช€ ๐Ÿ™‡ ๐Ÿ”› ๐Ÿ‘† ๐Ÿ‘ ๐Ÿ› ๏ธ ๐Ÿ“ฑ.

& โšซ๏ธ ๐Ÿ”œ ๐ŸŽฒ ๐Ÿช€ ๐Ÿ“š โšช๏ธโžก๏ธ 1๏ธโƒฃ ๐Ÿ“ฑ โญ.

โšซ๏ธ ๐Ÿ’ช 1๏ธโƒฃ โš–๏ธ 2๏ธโƒฃ โธ ๐Ÿ“Ÿ, ๐Ÿ’–:

callback_url = "https://example.com/api/v1/invoices/events/"
httpx.post(callback_url, json={"description": "Invoice paid", "paid": True})

โœ‹๏ธ ๐ŸŽฒ ๐Ÿ† โš  ๐Ÿ• โฒ โš’ ๐Ÿ’ญ ๐Ÿ‘ˆ ๐Ÿ‘† ๐Ÿ› ๏ธ ๐Ÿ‘ฉโ€๐Ÿ’ป (๐Ÿ”ข ๐Ÿ‘ฉโ€๐Ÿ’ป) ๐Ÿ› ๏ธ ๐Ÿ”ข ๐Ÿ› ๏ธ โ˜‘, ๐Ÿ›„ ๐Ÿ’ฝ ๐Ÿ‘ˆ ๐Ÿ‘† ๐Ÿ› ๏ธ ๐Ÿ”œ ๐Ÿ“จ ๐Ÿ“จ ๐Ÿ’ช โฒ, โ™’๏ธ.

, โšซ๏ธโ” ๐Ÿ‘ฅ ๐Ÿ”œ โญ ๐Ÿšฎ ๐Ÿ“Ÿ ๐Ÿ“„ โ” ๐Ÿ‘ˆ ๐Ÿ”ข ๐Ÿ› ๏ธ ๐Ÿ”œ ๐Ÿ‘€ ๐Ÿ’– ๐Ÿ“จ โฒ โšช๏ธโžก๏ธ ๐Ÿ‘† ๐Ÿ› ๏ธ.

๐Ÿ‘ˆ ๐Ÿงพ ๐Ÿ”œ ๐ŸŽฆ ๐Ÿ†™ ๐Ÿฆ ๐ŸŽš /docs ๐Ÿ‘† ๐Ÿ› ๏ธ, & โšซ๏ธ ๐Ÿ”œ โžก๏ธ ๐Ÿ”ข ๐Ÿ‘ฉโ€๐Ÿ’ป ๐Ÿ’ญ โ” ๐Ÿ— ๐Ÿ”ข ๐Ÿ› ๏ธ.

๐Ÿ‘‰ ๐Ÿ–ผ ๐Ÿšซ ๐Ÿ› ๏ธ โฒ โšซ๏ธ (๐Ÿ‘ˆ ๐Ÿ’ช โธ ๐Ÿ“Ÿ), ๐Ÿ•ด ๐Ÿงพ ๐Ÿ•.

Tip

โ˜‘ โฒ ๐Ÿ‡บ๐Ÿ‡ธ๐Ÿ” ๐Ÿ“จ.

๐Ÿ•โ” ๐Ÿ› ๏ธ โฒ ๐Ÿ‘†, ๐Ÿ‘† ๐Ÿ’ช โš™๏ธ ๐Ÿ•ณ ๐Ÿ’– ๐Ÿ‡ธ๐Ÿ‡ฒ โš–๏ธ ๐Ÿ“จ.

โœ โฒ ๐Ÿงพ ๐Ÿ“Ÿ

๐Ÿ‘‰ ๐Ÿ“Ÿ ๐Ÿ† ๐Ÿšซ ๐Ÿ› ๏ธ ๐Ÿ‘† ๐Ÿ“ฑ, ๐Ÿ‘ฅ ๐Ÿ•ด ๐Ÿ’ช โšซ๏ธ ๐Ÿ“„ โ” ๐Ÿ‘ˆ ๐Ÿ”ข ๐Ÿ› ๏ธ ๐Ÿ”œ ๐Ÿ‘€ ๐Ÿ’–.

โœ‹๏ธ, ๐Ÿ‘† โช ๐Ÿ’ญ โ” ๐Ÿ’ช โœ ๐Ÿง ๐Ÿงพ ๐Ÿ› ๏ธ โฎ๏ธ FastAPI.

๐Ÿ‘ฅ ๐Ÿ”œ โš™๏ธ ๐Ÿ‘ˆ ๐ŸŽ ๐Ÿ’ก ๐Ÿ“„ โ” ๐Ÿ”ข ๐Ÿ› ๏ธ ๐Ÿ”œ ๐Ÿ‘€ ๐Ÿ’–... ๐Ÿ— โžก ๐Ÿ› ๏ธ(โ“‚) ๐Ÿ‘ˆ ๐Ÿ”ข ๐Ÿ› ๏ธ ๐Ÿ”œ ๐Ÿ› ๏ธ (๐Ÿ• ๐Ÿ‘† ๐Ÿ› ๏ธ ๐Ÿ”œ ๐Ÿค™).

Tip

๐Ÿ•โ” โœ ๐Ÿ“Ÿ ๐Ÿ“„ โฒ, โšซ๏ธ ๐Ÿ’ช โš  ๐ŸŒˆ ๐Ÿ‘ˆ ๐Ÿ‘† ๐Ÿ‘ˆ ๐Ÿ”ข ๐Ÿ‘ฉโ€๐Ÿ’ป. & ๐Ÿ‘ˆ ๐Ÿ‘† โณ ๐Ÿ› ๏ธ ๐Ÿ”ข ๐Ÿ› ๏ธ, ๐Ÿšซ ๐Ÿ‘† ๐Ÿ› ๏ธ.

๐Ÿ• ๐Ÿ› ๏ธ ๐Ÿ‘‰ โ˜ ๐ŸŽ‘ ( ๐Ÿ”ข ๐Ÿ‘ฉโ€๐Ÿ’ป) ๐Ÿ’ช โ„น ๐Ÿ‘† ๐Ÿ’ญ ๐Ÿ’– โšซ๏ธ ๐ŸŒ… โญ ๐ŸŒโ” ๐Ÿšฎ ๐Ÿ”ข, Pydantic ๐Ÿท ๐Ÿ’ช, ๐Ÿ“จ, โ™’๏ธ. ๐Ÿ‘ˆ ๐Ÿ”ข ๐Ÿ› ๏ธ.

โœ โฒ APIRouter

๐Ÿฅ‡ โœ ๐Ÿ†• APIRouter ๐Ÿ‘ˆ ๐Ÿ”œ ๐Ÿ”Œ 1๏ธโƒฃ โš–๏ธ ๐ŸŒ… โฒ.

from typing import Union

from fastapi import APIRouter, FastAPI
from pydantic import BaseModel, HttpUrl

app = FastAPI()


class Invoice(BaseModel):
    id: str
    title: Union[str, None] = None
    customer: str
    total: float


class InvoiceEvent(BaseModel):
    description: str
    paid: bool


class InvoiceEventReceived(BaseModel):
    ok: bool


invoices_callback_router = APIRouter()


@invoices_callback_router.post(
    "{$callback_url}/invoices/{$request.body.id}", response_model=InvoiceEventReceived
)
def invoice_notification(body: InvoiceEvent):
    pass


@app.post("/invoices/", callbacks=invoices_callback_router.routes)
def create_invoice(invoice: Invoice, callback_url: Union[HttpUrl, None] = None):
    """
    Create an invoice.

    This will (let's imagine) let the API user (some external developer) create an
    invoice.

    And this path operation will:

    * Send the invoice to the client.
    * Collect the money from the client.
    * Send a notification back to the API user (the external developer), as a callback.
        * At this point is that the API will somehow send a POST request to the
            external API with the notification of the invoice event
            (e.g. "payment successful").
    """
    # Send the invoice, collect the money, send the notification (the callback)
    return {"msg": "Invoice received"}

โœ โฒ โžก ๐Ÿ› ๏ธ

โœ โฒ โžก ๐Ÿ› ๏ธ โš™๏ธ ๐ŸŽ APIRouter ๐Ÿ‘† โœ ๐Ÿ”›.

โšซ๏ธ ๐Ÿ”œ ๐Ÿ‘€ ๐Ÿ’– ๐Ÿ˜ FastAPI โžก ๐Ÿ› ๏ธ:

  • โšซ๏ธ ๐Ÿ”œ ๐ŸŽฒ โœ”๏ธ ๐Ÿ“„ ๐Ÿ’ช โšซ๏ธ ๐Ÿ”œ ๐Ÿ“จ, โœ… body: InvoiceEvent.
  • & โšซ๏ธ ๐Ÿ’ช โœ”๏ธ ๐Ÿ“„ ๐Ÿ“จ โšซ๏ธ ๐Ÿ”œ ๐Ÿ“จ, โœ… response_model=InvoiceEventReceived.
from typing import Union

from fastapi import APIRouter, FastAPI
from pydantic import BaseModel, HttpUrl

app = FastAPI()


class Invoice(BaseModel):
    id: str
    title: Union[str, None] = None
    customer: str
    total: float


class InvoiceEvent(BaseModel):
    description: str
    paid: bool


class InvoiceEventReceived(BaseModel):
    ok: bool


invoices_callback_router = APIRouter()


@invoices_callback_router.post(
    "{$callback_url}/invoices/{$request.body.id}", response_model=InvoiceEventReceived
)
def invoice_notification(body: InvoiceEvent):
    pass


@app.post("/invoices/", callbacks=invoices_callback_router.routes)
def create_invoice(invoice: Invoice, callback_url: Union[HttpUrl, None] = None):
    """
    Create an invoice.

    This will (let's imagine) let the API user (some external developer) create an
    invoice.

    And this path operation will:

    * Send the invoice to the client.
    * Collect the money from the client.
    * Send a notification back to the API user (the external developer), as a callback.
        * At this point is that the API will somehow send a POST request to the
            external API with the notification of the invoice event
            (e.g. "payment successful").
    """
    # Send the invoice, collect the money, send the notification (the callback)
    return {"msg": "Invoice received"}

๐Ÿ“ค 2๏ธโƒฃ ๐Ÿ‘‘ ๐Ÿ”บ โšช๏ธโžก๏ธ ๐Ÿ˜ โžก ๐Ÿ› ๏ธ:

  • โšซ๏ธ ๐Ÿšซ ๐Ÿ’ช โœ”๏ธ ๐Ÿ™† โ˜‘ ๐Ÿ“Ÿ, โ†ฉ๏ธ ๐Ÿ‘† ๐Ÿ“ฑ ๐Ÿ”œ ๐Ÿ™… ๐Ÿค™ ๐Ÿ‘‰ ๐Ÿ“Ÿ. โšซ๏ธ ๐Ÿ•ด โš™๏ธ ๐Ÿ“„ ๐Ÿ”ข ๐Ÿ› ๏ธ. , ๐Ÿ”ข ๐Ÿ’ช โœ”๏ธ pass.
  • โžก ๐Ÿ’ช ๐Ÿ”Œ ๐Ÿ—„ 3๏ธโƒฃ ๐Ÿงฌ (๐Ÿ‘€ ๐ŸŒ– ๐Ÿ”›) ๐ŸŒโ” โšซ๏ธ ๐Ÿ’ช โš™๏ธ ๐Ÿ”ข โฎ๏ธ ๐Ÿ”ข & ๐Ÿ• โฎ๏ธ ๐Ÿ“จ ๐Ÿ“จ ๐Ÿ‘† ๐Ÿ› ๏ธ.

โฒ โžก ๐Ÿงฌ

โฒ โžก ๐Ÿ’ช โœ”๏ธ ๐Ÿ—„ 3๏ธโƒฃ ๐Ÿงฌ ๐Ÿ‘ˆ ๐Ÿ’ช ๐Ÿ”Œ ๐Ÿ• โฎ๏ธ ๐Ÿ“จ ๐Ÿ“จ ๐Ÿ‘† ๐Ÿ› ๏ธ.

๐Ÿ‘‰ ๐Ÿ’ผ, โšซ๏ธ str:

"{$callback_url}/invoices/{$request.body.id}"

, ๐Ÿšฅ ๐Ÿ‘† ๐Ÿ› ๏ธ ๐Ÿ‘ฉโ€๐Ÿ’ป (๐Ÿ”ข ๐Ÿ‘ฉโ€๐Ÿ’ป) ๐Ÿ“จ ๐Ÿ“จ ๐Ÿ‘† ๐Ÿ› ๏ธ :

https://yourapi.com/invoices/?callback_url=https://www.external.org/events

โฎ๏ธ ๐ŸŽป ๐Ÿ’ช:

{
    "id": "2expen51ve",
    "customer": "Mr. Richie Rich",
    "total": "9999"
}

โคด๏ธ ๐Ÿ‘† ๐Ÿ› ๏ธ ๐Ÿ”œ ๐Ÿ› ๏ธ ๐Ÿงพ, & โ˜ โช, ๐Ÿ“จ โฒ ๐Ÿ“จ callback_url ( ๐Ÿ”ข ๐Ÿ› ๏ธ):

https://www.external.org/events/invoices/2expen51ve

โฎ๏ธ ๐ŸŽป ๐Ÿ’ช โš— ๐Ÿ•ณ ๐Ÿ’–:

{
    "description": "Payment celebration",
    "paid": true
}

& โšซ๏ธ ๐Ÿ”œ โŒ› ๐Ÿ“จ โšช๏ธโžก๏ธ ๐Ÿ‘ˆ ๐Ÿ”ข ๐Ÿ› ๏ธ โฎ๏ธ ๐ŸŽป ๐Ÿ’ช ๐Ÿ’–:

{
    "ok": true
}

Tip

๐Ÿ‘€ โ” โฒ ๐Ÿ“› โš™๏ธ ๐Ÿ”Œ ๐Ÿ“› ๐Ÿ“จ ๐Ÿ”ข ๐Ÿ”ข callback_url (https://www.external.org/events) & ๐Ÿงพ id โšช๏ธโžก๏ธ ๐Ÿ”˜ ๐ŸŽป ๐Ÿ’ช (2expen51ve).

๐Ÿšฎ โฒ ๐Ÿ“ป

๐Ÿ‘‰ โ˜ ๐Ÿ‘† โœ”๏ธ โฒ โžก ๐Ÿ› ๏ธ(โ“‚) ๐Ÿ’ช (1๏ธโƒฃ(โ“‚) ๐Ÿ‘ˆ ๐Ÿ”ข ๐Ÿ‘ฉโ€๐Ÿ’ป ๐Ÿ”œ ๐Ÿ› ๏ธ ๐Ÿ”ข ๐Ÿ› ๏ธ) โฒ ๐Ÿ“ป ๐Ÿ‘† โœ ๐Ÿ”›.

๐Ÿ”œ โš™๏ธ ๐Ÿ”ข callbacks ๐Ÿ‘† ๐Ÿ› ๏ธ โžก ๐Ÿ› ๏ธ ๐Ÿ‘จโ€๐ŸŽจ ๐Ÿšถโ€โ™€๏ธ ๐Ÿ”ข .routes (๐Ÿ‘ˆ ๐Ÿค™ list ๐Ÿ›ฃ/โžก ๐Ÿ› ๏ธ) โšช๏ธโžก๏ธ ๐Ÿ‘ˆ โฒ ๐Ÿ“ป:

from typing import Union

from fastapi import APIRouter, FastAPI
from pydantic import BaseModel, HttpUrl

app = FastAPI()


class Invoice(BaseModel):
    id: str
    title: Union[str, None] = None
    customer: str
    total: float


class InvoiceEvent(BaseModel):
    description: str
    paid: bool


class InvoiceEventReceived(BaseModel):
    ok: bool


invoices_callback_router = APIRouter()


@invoices_callback_router.post(
    "{$callback_url}/invoices/{$request.body.id}", response_model=InvoiceEventReceived
)
def invoice_notification(body: InvoiceEvent):
    pass


@app.post("/invoices/", callbacks=invoices_callback_router.routes)
def create_invoice(invoice: Invoice, callback_url: Union[HttpUrl, None] = None):
    """
    Create an invoice.

    This will (let's imagine) let the API user (some external developer) create an
    invoice.

    And this path operation will:

    * Send the invoice to the client.
    * Collect the money from the client.
    * Send a notification back to the API user (the external developer), as a callback.
        * At this point is that the API will somehow send a POST request to the
            external API with the notification of the invoice event
            (e.g. "payment successful").
    """
    # Send the invoice, collect the money, send the notification (the callback)
    return {"msg": "Invoice received"}

Tip

๐Ÿ‘€ ๐Ÿ‘ˆ ๐Ÿ‘† ๐Ÿšซ ๐Ÿšถโ€โ™€๏ธ ๐Ÿ“ป โšซ๏ธ (invoices_callback_router) callback=, โœ‹๏ธ ๐Ÿ”ข .routes, invoices_callback_router.routes.

โœ… ๐Ÿฉบ

๐Ÿ”œ ๐Ÿ‘† ๐Ÿ’ช โ–ถ๏ธ ๐Ÿ‘† ๐Ÿ“ฑ โฎ๏ธ Uvicorn & ๐Ÿšถ http://127.0.0.1:8000/docs.

๐Ÿ‘† ๐Ÿ”œ ๐Ÿ‘€ ๐Ÿ‘† ๐Ÿฉบ โœ… "โฒ" ๐Ÿ“„ ๐Ÿ‘† โžก ๐Ÿ› ๏ธ ๐Ÿ‘ˆ ๐ŸŽฆ โ” ๐Ÿ”ข ๐Ÿ› ๏ธ ๐Ÿ”œ ๐Ÿ‘€ ๐Ÿ’–: