A Python wrapper for the WooCommerce API.

Overview

WooCommerce API - Python Client

A Python wrapper for the WooCommerce REST API. Easily interact with the WooCommerce REST API using this library.

Installation

pip install woocommerce

Getting started

Generate API credentials (Consumer Key & Consumer Secret) following this instructions http://woocommerce.github.io/woocommerce-rest-api-docs/#rest-api-keys.

Check out the WooCommerce API endpoints and data that can be manipulated in http://woocommerce.github.io/woocommerce-rest-api-docs/.

Setup

from woocommerce import API

wcapi = API(
    url="http://example.com",
    consumer_key="ck_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    consumer_secret="cs_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    version="wc/v3"
)

Options

Option Type Required Description
url string yes Your Store URL, example: http://woo.dev/
consumer_key string yes Your API consumer key
consumer_secret string yes Your API consumer secret
version string no API version, default is wc/v3
timeout integer no Connection timeout, default is 5
verify_ssl bool no Verify SSL when connect, use this option as False when need to test with self-signed certificates
query_string_auth bool no Force Basic Authentication as query string when True and using under HTTPS, default is False
oauth_timestamp integer no Custom timestamp for requests made with oAuth1.0a
wp_api bool no Set to False in order to use the legacy WooCommerce API (deprecated)

Methods

Params Type Description
endpoint string WooCommerce API endpoint, example: customers or order/12
data dictionary Data that will be converted to JSON
**kwargs dictionary Accepts params, also other Requests arguments

GET

  • .get(endpoint, **kwargs)

POST

  • .post(endpoint, data, **kwargs)

PUT

  • .put(endpoint, data), **kwargs

DELETE

  • .delete(endpoint, **kwargs)

OPTIONS

  • .options(endpoint, **kwargs)

Response

All methods will return Response object.

Example of returned data:

>>> r = wcapi.get("products")
>>> r.status_code
200
>>> r.headers['content-type']
'application/json; charset=UTF-8'
>>> r.encoding
'UTF-8'
>>> r.text
u'{"products":[{"title":"Flying Ninja","id":70,...' // Json text
>>> r.json()
{u'products': [{u'sold_individually': False,... // Dictionary data

Request with params example

from woocommerce import API

wcapi = API(
    url="http://example.com",
    consumer_key="ck_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    consumer_secret="cs_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    version="wc/v3"
)

# Force delete example.
print(wcapi.delete("products/100", params={"force": True}).json())

# Query example.
print(wcapi.get("products", params={"per_page": 20}).json())

Changelog

2.1.1 - 2019/07/22

  • Updated Request library to 2.22.0.
  • Updated examples.

2.1.0 - 2019/01/15

  • Uses WP REST API by default, need to force wp_api as False in order to use the legacy WooCommerce API.
  • Updated default REST API version to wc/v3.

2.0.0 - 2019/01/15

  • Updated "Requests" library to version 2.20.0.
  • Added support for custom timestamps in oAuth1.0a requests with oauth_timestamp.
  • Allow pass custom arguments to "Requests" library.

1.2.1 - 2016/12/14

  • Fixed WordPress 4.7 compatibility.

1.2.0 - 2016/06/22

  • Added option query_string_auth to allow Basic Auth as query strings.

1.1.1 - 2016/06/03

  • Fixed oAuth signature for WP REST API.

1.1.0 - 2016/05/09

  • Added support for WP REST API.
  • Added method to do HTTP OPTIONS requests.

1.0.5 - 2015/12/07

  • Fixed oAuth filters sorting.

1.0.4 - 2015/09/25

  • Implemented timeout argument for API class.

1.0.3 - 2015/08/07

  • Forced utf-8 encoding on API.__request() to avoid UnicodeDecodeError

1.0.2 - 2015/08/05

  • Fixed handler for query strings

1.0.1 - 2015/07/13

  • Fixed support for Python 2.6

1.0.1 - 2015/07/12

  • Initial version
Comments
  • wcapi.get('orders') returns 403

    wcapi.get('orders') returns 403

    I connect to my WooCommerce webshop through the WooCommerce REST API Python wrapper,

    I.e,

    from woocommerce import API
    
    wcapi = API(
        url="https://mywebshop.whatever",
        consumer_key="ck_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        consumer_secret="cs_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        wp_api=True,
        version="wc/v1"
    )
    

    API has read/write access.

    All worked fine for months up to yesterday.


    Problem

    Since yesterday latest_order = wcapi.get('orders').json() returns a JSONDecodeError: Expecting value. Also, wcapi.get('orders') returns a <Response [403]>.

    I don't know what's causing this all of a sudden and I'm not sure how to solve it either.

    opened by LucSpan 20
  • getting an import error.

    getting an import error.

    after doing the pip install WooCommerce and placing the

    from woocommerce import API

    test = API(values here)

    running this shows this below.

    from woocommerce import API ImportError: cannot import name 'API'

    opened by ecampii 11
  • Issue with authentication consumer key or consumer secret invalid

    Issue with authentication consumer key or consumer secret invalid

    I'm creating credentials using the endpoint /wc-auth/v1/authorize with scope=read_write most times the consumer key and secret that I get are valid, but a couple of times I get consumer key or consumer secrets that are invalid when I try to use them later in code like this:

    wcapi = API(
        url=  shop_url,
        consumer_key= key,
        consumer_secret= secret
    )
    response = wcapi.get("orders?page=1")
    # Then response.text is {"errors":[{"code":"woocommerce_api_authentication_error","message":"Consumer Secret is invalid"}]}
    #  or {"errors":[{"code":"woocommerce_api_authentication_error","message":"Consumer Key is invalid"}]}
    

    Has this issue been detected yet? Is it related to the python wrapper or woocommerce plugin?

    opened by assislucas 10
  • Timeout exception yet uploaded the data

    Timeout exception yet uploaded the data

    I am having a weird issue. I am using API for a Woocommerce setup on my local machine. Onr running I am getting the exceptions:

    Traceback (most recent call last):
      File "/Users/Me/Data/anaconda3/lib/python3.7/site-packages/urllib3/connectionpool.py", line 384, in _make_request
        six.raise_from(e, None)
      File "<string>", line 2, in raise_from
      File "/Users/Me/Data/anaconda3/lib/python3.7/site-packages/urllib3/connectionpool.py", line 380, in _make_request
        httplib_response = conn.getresponse()
      File "/Users/Me/Data/anaconda3/lib/python3.7/http/client.py", line 1321, in getresponse
        response.begin()
      File "/Users/Me/Data/anaconda3/lib/python3.7/http/client.py", line 296, in begin
        version, status, reason = self._read_status()
      File "/Users/Me/Data/anaconda3/lib/python3.7/http/client.py", line 257, in _read_status
        line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
      File "/Users/Me/Data/anaconda3/lib/python3.7/socket.py", line 589, in readinto
        return self._sock.recv_into(b)
    socket.timeout: timed out
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/Users/Me/Data/anaconda3/lib/python3.7/site-packages/requests/adapters.py", line 449, in send
        timeout=timeout
      File "/Users/Me/Data/anaconda3/lib/python3.7/site-packages/urllib3/connectionpool.py", line 638, in urlopen
        _stacktrace=sys.exc_info()[2])
      File "/Users/Me/Data/anaconda3/lib/python3.7/site-packages/urllib3/util/retry.py", line 368, in increment
        raise six.reraise(type(error), error, _stacktrace)
      File "/Users/Me/Data/anaconda3/lib/python3.7/site-packages/urllib3/packages/six.py", line 686, in reraise
        raise value
      File "/Users/Me/Data/anaconda3/lib/python3.7/site-packages/urllib3/connectionpool.py", line 600, in urlopen
        chunked=chunked)
      File "/Users/Me/Data/anaconda3/lib/python3.7/site-packages/urllib3/connectionpool.py", line 386, in _make_request
        self._raise_timeout(err=e, url=url, timeout_value=read_timeout)
      File "/Users/Me/Data/anaconda3/lib/python3.7/site-packages/urllib3/connectionpool.py", line 306, in _raise_timeout
        raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value)
    urllib3.exceptions.ReadTimeoutError: HTTPConnectionPool(host='localhost', port=80): Read timed out. (read timeout=5)
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/Users/Me/Data/Business/NisaaPK/data_uploader_api/uploader.py", line 48, in <module>
        add_product(wcapi)
      File "/Users/Me/Data/Business/NisaaPK/data_uploader_api/uploader.py", line 31, in add_product
        print(wc.post("products", data))
      File "/Users/Me/Data/anaconda3/lib/python3.7/site-packages/woocommerce/api.py", line 112, in post
        return self.__request("POST", endpoint, data, **kwargs)
      File "/Users/Me/Data/anaconda3/lib/python3.7/site-packages/woocommerce/api.py", line 103, in __request
        **kwargs
      File "/Users/Me/Data/anaconda3/lib/python3.7/site-packages/requests/api.py", line 60, in request
        return session.request(method=method, url=url, **kwargs)
      File "/Users/Me/Data/anaconda3/lib/python3.7/site-packages/requests/sessions.py", line 533, in request
        resp = self.send(prep, **send_kwargs)
      File "/Users/Me/Data/anaconda3/lib/python3.7/site-packages/requests/sessions.py", line 646, in send
        r = adapter.send(request, **kwargs)
      File "/Users/Me/Data/anaconda3/lib/python3.7/site-packages/requests/adapters.py", line 529, in send
        raise ReadTimeout(e, request=request)
    requests.exceptions.ReadTimeout: HTTPConnectionPool(host='localhost', port=80): Read timed out. (read timeout=5)
    

    When I checked on the site the product was there! This is the code I am using:

    from woocommerce import API
    
    
    def add_product(wc):
        data = {
            "name": "Sample Product",
            "type": "simple",
            "regular_price": "1221.99",
            "sale_price": "921.99",
            "description": "Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.",
            "short_description": "Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.",
            "categories": [
                {
                    "id": 135
                },
            ],
            "tags": [
    
            ],
            "button_text": "Visit here to buy",
            "images": [
                {
                    "src": "http://demo.woothemes.com/woocommerce/wp-content/uploads/sites/56/2013/06/T_2_front.jpg"
                },
                {
                    "src": "http://demo.woothemes.com/woocommerce/wp-content/uploads/sites/56/2013/06/T_2_back.jpg"
                }
            ],
            "external_url": 'http://adnansiddiqi.me'
        }
        print(wc.post("products", data))
    
    
    if __name__ == '__main__':
        KEY = 'XXX'
        SECRET = 'XXX'
    
        wcapi = API(
            url="http://localhost/shop.ab/",
            consumer_key=KEY,
            consumer_secret=SECRET,
            version="wc/v3"
        )
    
        # r = wcapi.get("products")
        # products = r.json()
        # print(len(products))
        add_product(wcapi)
    
    opened by kadnan 6
  • per_page and all integer parameters does't works

    per_page and all integer parameters does't works

    While trying to get product/categories from Woocommerce I got this error: "per_page is not of type integer"

    my code:

    wcapi = API( url="http://my_web.site", consumer_key="ck_XXXXXXXXXXXXXXXXXXXXXXXXXXXX", consumer_secret="cs_XXXXXXXXXXXXXXXXXXXXXXXXXXXX", version="wc/v3" )

    categories = wcapi.get("products/categories/?per_page=1").json()

    get the same error for all integer parameters

    opened by Damiano-Franco 6
  • woocommerce_api_authentication_error

    woocommerce_api_authentication_error","message":"Consumer Secret is invalid

    When using HTTPS in the API URL parameter below the authentication fails with the error"

    "woocommerce_api_authentication_error","message":"Consumer Secret is invalid".

    HTTP works fine.

    Questions:

    • Any suggestions on how to troubleshoot this?
    • If this is a potential server side configuration issues, do you have any pointers on how to configure it correctly?
    • Could you give me an example of how to use query parameters instead? The WooCommerce REST API documentation hints at an example for servers that not properly parse the Authorization header, but it is actually missing.
    API(
                url="https://kashalife.net/",
                consumer_key   ="ck_16c59a1a0693c2723928830da52a30640c2311fd",
                consumer_secret="cs_0b4e0f17741e024b31d0ef799257b972db473305",
                wp_api=False,
                verify_ssl=False,
                version="v3",
            )
    

    Thanks - Christoph

    opened by chbichsel 6
  • Not working anymore

    Not working anymore

    Hello,

    As of a few months this module does not seem to work anymore, I found the culprit, as it seems to work when I include this header: 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0'. This explains why CURL works, but python requests not anymore.

    Best regards,

    Evert

    opened by Evert-Arends 5
  • Download all Products

    Download all Products

    First thank you very much for this amazing work!!

    I am trying to get all the products and I don' really know how to do it.

    I have tried to do

    wcapi.get('products?per_page=100') But I have more than 100 products

    Furthermore, I have tried to introduce the pagination as it is recommended in the manual, but it does not say how to introduce it in the code...

    I would love if someone could help me out with this.

    Yours sincerely,

    opened by eduaero 5
  • REST authentication error

    REST authentication error

    Hello,

    Having truble authenticating with rest api, all the time I get the same error.

    Wordpress 4.7.4 Woocommerce 3.0.5 Python 2.7.13

    from woocommerce import API
    
    wcapi = API(
        url="http://XYZ/~aclassi2/note/",
        consumer_key="ck_YYY",
        consumer_secret="cs_XXX",
        wp_api=True,
        version="wc/v2",
        verify_ssl=False,
        query_string_auth=True
    )
    
    {"code":"woocommerce_rest_authentication_error","message":"Invalid signature - provided signature does not match.","data":{"status":401}}
    
    

    When I use Postman, it works fine. I also tested with nodeJS, is maybe python lib broken?

    opened by hrvatskibogmars 5
  • Can't use OAuth (API calls over HTTP)

    Can't use OAuth (API calls over HTTP)

    Hi,

    Tested with versions 1.0.1 and 1.0.2, I can't use this library over HTTP. It seems to be related to the OAuth signature generated by the OAuth class.

    Here is my code (adapted from the README example) :

    wcapi = API(
        url="http://0.0.0.0:8080",
        consumer_key=WC_API_KEY,
        consumer_secret=WC_API_SECRET,
        version="v2",
        verify_ssl=False
    )
    
    r = wcapi.get("products")
    
    print(r.status_code)
    print(r.text)
    

    Here is the return :

    401
    {'errors': [{'code': 'woocommerce_api_authentication_error', 'message': 'Signature invalide - la signature fournie ne correspond pas'}]}
    

    (I'm using a French translation of WooCommerce)

    Do I need to force the use of OAuth1 somewhere ?

    Thanks for your help

    opened by Djiit 5
  • api accepts url params and additional keyword args for requests module

    api accepts url params and additional keyword args for requests module

    Currently the url params that are sent to Woo-Commerce are a closed box. They should be exposed outside of the function. Additionally, there are cases where a developer needs to pass additional parameters to the requests library. These should also be exposed outside of the function.

    I've been meaning to make a pull request for this. I have previously sub-classed the woocommerce.api.API object in order to do this and think it would be helpful to others who like me need to do more complicated requests.

    opened by timjen3 4
  • unable to update a product

    unable to update a product

    I am trying to update products in my store. But, the put/post methods do not work at all. The requests are executed but there are no changes in the product's properties. I gave my homepage URL as the url param, and the permalink in the wordpress is set to something like https://my-website.co.il/year/month/day/sample-post/. below is the constructor defined wcapi = API( url=STORE, consumer_key=DEV, consumer_secret=SECRET, wp_api=True, version="wc/v2", query_string_auth=True ) and here is how I update a product wcapi.put("products/4713", data={'price':'0.15'}).json()

    and then it returns the product with old price.

    Actually, the product is not updated and still it does not give an error.

    opened by Irfan-Ahmad-byte 0
  • Add request session

    Add request session

    Issue https://github.com/woocommerce/wc-api-python/issues/76 discusses the performance issue inherent in recreating a full HTTPS connection for every request.

    This PR enables request Session.

    opened by rooprob 0
  • Fetching 'products' fails with a 403 error despite other successful API calls

    Fetching 'products' fails with a 403 error despite other successful API calls

    Hello! Thanks for this library, though I'm having a little trouble retrieving products specifically. I have no trouble retrieving e.g. orders and customers.

    This works:

    import os
    from woocommerce import API
    
    WOOCOMMERCE_API_CONSUMER_KEY = os.environ.get('WOOCOMMERCE_API_CONSUMER_KEY')
    WOOCOMMERCE_API_CONSUMER_SECRET = os.environ.get('WOOCOMMERCE_API_CONSUMER_SECRET')  # noqa
    
    wcapi = API(
        url='https://xxxxxxxx.org',
        consumer_key=WOOCOMMERCE_API_CONSUMER_KEY,
        consumer_secret=WOOCOMMERCE_API_CONSUMER_SECRET,
        version='wc/v3',
        user_agent='PostmanRuntime/7.26.5'
    )
    
    data = wcapi.get('orders')
    # data = wcapi.get('customers')
    
    print(data.status_code)
    

    Trying wcapi.get('products'), however, throws a 403 status code:

    import os
    from woocommerce import API
    
    WOOCOMMERCE_API_CONSUMER_KEY = os.environ.get('WOOCOMMERCE_API_CONSUMER_KEY')
    WOOCOMMERCE_API_CONSUMER_SECRET = os.environ.get('WOOCOMMERCE_API_CONSUMER_SECRET')  # noqa
    
    wcapi = API(
        url='https://xxxxxxxx.org',
        consumer_key=WOOCOMMERCE_API_CONSUMER_KEY,
        consumer_secret=WOOCOMMERCE_API_CONSUMER_SECRET,
        version='wc/v3',
        user_agent='PostmanRuntime/7.26.5'
    )
    
    data = wcapi.get('products')
    
    print(data.status_code)
    

    Any help is much appreciated, thanks!

    opened by cjwinchester 2
  • timeout increased to 10sec

    timeout increased to 10sec

    before timeout set to 5sec its very low some times if network is not good getting this error :

    raise ReadTimeout(e, request=request)
    requests.exceptions.ReadTimeout: HTTPSConnectionPool(host='......', port=....): Read timed out. (read timeout=5)
    

    for every two request i am getting this problem so i increased the timeout to 10 sec...

    Thank you.

    opened by Balaji-Kotni 2
  • low_stock_amount is string

    low_stock_amount is string

    Issue summary

    When I fetch a WooCommerce product using this API, the variable low_stock_amount is an empty string, I believe should be an integer '0'.

    Expected behavior

    Always return an integer. or a 0

    Actual behavior

    It returns an empty string.

    Steps to reproduce the problem

    1. response = wcapi.get('products', params={'sku':sku}).json()
    2. print(response)

    ##Related bug I believe this is a related bug


    opened by jmatah 0
Releases(3.0.0)
  • 3.0.0(Mar 13, 2021)

    2021-03-13

    Removed

    • Removed support to legacy Python versions, now supports Python 3.6+.
    • Removed ordereddict package dependency.

    Added

    • Added support for Python 3.8 and Python 3.9.
    • Added option to set custom user_agent.

    Changed

    • Updated default "User-Agent" to WooCommerce-Python-REST-API/3.0.0.
    • Updated Request library to 2.25.1.

    Fixed

    • Fixed Basic Auth in Python 3.8.
    Source code(tar.gz)
    Source code(zip)
Chatbot construido com o framework Rasa para responder dúvidas referentes ao COVID-19.

Racom Chatbot Chatbot construido com o framework Rasa. Como executar Necessário instalar Docker e Docker Compose. Para inicializar a aplicação, basta

Vinícius Souza 4 Jul 28, 2022
A Telegram Bot with(Forwarder Bot + User Bot + More Features )

A Telegram Bot with(Forwarder Bot + User Bot + More Features )

Kaif 3 Feb 16, 2022
A FORKED AND Modded version of TL:GD for 🅱️3R0K🧲support

for support join here working example group Leech Here For Any Issues/Imrovements or Discussions go here or here Please Leave A star And Fork this Rep

KangersHub 202 Dec 26, 2022
Discord Account Generator that will create Account with hCaptcha bypass. Using socks4 proxies

Account-Generator [!] This was made for education. Please use socks4 proxies for nice experiences. [!] Please install these modules - "pip3 install ht

RyanzSantos 10 Feb 23, 2022
A replacement for Reddit /r/copypasta CummyBot2000 with extra measures to avoid it being banned.

CummyBot1984 A replacement for Reddit /r/copypasta's CummyBot2000 with extra measures to respect Reddit's API rules. Features Copies and replies to ev

2 Feb 21, 2022
Listen to the radio station from your favorite broadcast

Latest news Listen to the radio station from your favorite broadcast MyCroft Radio Skill for testing and copy at docker skill About Play regional radi

1 Dec 22, 2021
A simple telegram Bot, Upload Media File| video To telegram using the direct download link. (youtube, Mediafire, google drive, mega drive, etc)

URL-Uploader (Bot) A Bot Upload file|video To Telegram using given Links. Features: 👉 Only Auth Users (AUTH_USERS) Can Use The Bot 👉 Upload YTDL Sup

Hash Minner 18 Dec 17, 2022
Cleiton Leonel 4 Apr 22, 2022
Check and write all account info + Check nitro on account

Discord-Token-Checker Check and write all account info + Check nitro on account Also check https://github.com/GuFFy12/Discord-Token-Parser (Parse disc

36 Jan 01, 2023
Google translator bot using pyTelegramBotAPI

iTranslator-bot Super google translator bot using pyTelegramBotAPI A bot is a professional bot that automatically detects a language in texts or capti

Abdulatif 6 Nov 22, 2022
Multipurpose Discord bot hosted on replit.com

RockyBot Multipurpose Discord bot hosted on https://replit.com/ Installing Dependencies Install poetry through pip: pip install poetry Then simply exe

Rocky 2 May 18, 2022
This library is for simplified work with the sms-man.com API

SMSMAN Public API Python This is a lightweight library that works as a connector to Sms-Man public API Installation pip install smsman Documentation h

13 Nov 19, 2022
Pincer-bot-template - A template for a Discord bot created using the Pincer library

Pincer Discord Bot Template (Python) WARNING: Pincer is still in its alpha/plann

binds 2 Mar 17, 2022
A python API for BSCScan (Binance Smart Chain Explorer), available on PyPI.

bscscan-python A complete Python API for BscScan.com, available on PyPI. Powered by BscScan.com APIs. This is a gently modified fork of the etherscan-

Panagiotis Kotsias 246 Dec 31, 2022
Mini Tool to lovers of debe from eksisozluk (one of the most famous website -reffered as collaborative dictionary like reddit- in Turkey) for pushing debe (Most Liked Entries of Yesterday) to kindle every day via Github Actions.

debe to kindle Mini Tool to lovers of debe from eksisozluk (one of the most famous website -refered as collaborative dictionary like reddit- in Turkey

11 Oct 11, 2022
A Simple Telegram Bot To Download And Upload Files

AquaDLBot ➠ I Can Download And Upload files To Telegram DEMO Copyright (C) 2020-2026 by [ema

Asia Argento 8 Feb 15, 2022
Bulk NFT uploader to OpenSea!

Bulk NFT Uploader Description Simple easy peasy python script which logins to opensea account using metamask and bulk uploads NFT to your default coll

Lakshya Khera 25 May 23, 2022
Powerful and Async API for AnimeWorld.tv 🚀

Powerful and Async API for AnimeWorld.tv 🚀

1 Nov 13, 2021
Yes, it's true :revolving_hearts: This repository has 301 stars.

Yes, it's true! Inspired by a similar repository from @RealPeha, but implemented using a webhook on AWS Lambda and API Gateway, so it's serv

510 Dec 28, 2022