Skip to main content

Ultra fast python binding for curl-impersonate via cython

Project description

curl_cffi

PyPI - Downloads PyPI - Python Version PyPI version Generic badge Generic badge

Documentation | 中文 README

Python binding for curl-impersonate via cffi.

Unlike other pure python http clients like httpx or requests, curl_cffi can impersonate browsers' TLS/JA3 and HTTP/2 fingerprints. If you are blocked by some website for no obvious reason, you can give curl_cffi a try.

The fingerprints in 0.6 on Windows are all wrong, you should update to 0.7 if you are on Windows. Sorry for the inconvenience.

Only Python 3.8 and above are supported. Python 3.7 has reached its end of life.


Scrapfly.io

Scrapfly is an enterprise-grade solution providing Web Scraping API that aims to simplify the scraping process by managing everything: real browser rendering, rotating proxies, and fingerprints (TLS, HTTP, browser) to bypass all major anti-bots. Scrapfly also unlocks the observability by providing an analytical dashboard and measuring the success rate/block rate in detail.

Scrapfly is a good solution if you are looking for a cloud-managed solution for curl_cffi. If you are managing TLS/HTTP fingerprint by yourself with curl_cffi, they also maintain a curl to python converter.


Features

  • Supports JA3/TLS and http2 fingerprints impersonation, inlucding recent browsers and custome fingerprints.
  • Much faster than requests/httpx, on par with aiohttp/pycurl, see benchmarks.
  • Mimics requests API, no need to learn another one.
  • Pre-compiled, so you don't have to compile on your machine.
  • Supports asyncio with proxy rotation on each request.
  • Supports http 2.0, which requests does not.
  • Supports websocket.
requests aiohttp httpx pycurl curl_cffi
http2
sync
async
websocket
fingerprints
speed 🐇 🐇🐇 🐇 🐇🐇 🐇🐇

Install

pip install curl_cffi --upgrade

This should work on Linux, macOS and Windows out of the box. If it does not work on you platform, you may need to compile and install curl-impersonate first and set some environment variables like LD_LIBRARY_PATH.

To install beta releases:

pip install curl_cffi --upgrade --pre

To install unstable version from GitHub:

git clone https://github.com/yifeikong/curl_cffi/
cd curl_cffi
make preprocess
pip install .

Usage

curl_cffi comes with a low-level curl API and a high-level requests-like API.

requests-like

from cycurl import requests

# Notice the impersonate parameter
r = requests.get("https://tools.scrapfly.io/api/fp/ja3", impersonate="chrome")

print(r.json())
# output: {..., "ja3n_hash": "aa56c057ad164ec4fdcb7a5a283be9fc", ...}
# the js3n fingerprint should be the same as target browser

# To keep using the latest browser version as `curl_cffi` updates,
# simply set impersonate="chrome" without specifying a version.
# Other similar values are: "safari" and "safari_ios"
r = requests.get("https://tools.scrapfly.io/api/fp/ja3", impersonate="chrome")

# To pin a specific version, use version numbers together.
r = requests.get("https://tools.scrapfly.io/api/fp/ja3", impersonate="chrome124")

# To impersonate other than browsers, bring your own ja3/akamai strings
# See examples directory for details.
r = requests.get("https://tls.browserleaks.com/json", ja3=..., akamai=...)

# http/socks proxies are supported
proxies = {"https": "http://localhost:3128"}
r = requests.get("https://tools.scrapfly.io/api/fp/ja3", impersonate="chrome", proxies=proxies)

proxies = {"https": "socks://localhost:3128"}
r = requests.get("https://tools.scrapfly.io/api/fp/ja3", impersonate="chrome", proxies=proxies)

Sessions

s = requests.Session()

# httpbin is a http test website, this endpoint makes the server set cookies
s.get("https://httpbin.org/cookies/set/foo/bar")
print(s.cookies)
# <Cookies[<Cookie foo=bar for httpbin.org />]>

# retrieve cookies again to verify
r = s.get("https://httpbin.org/cookies")
print(r.json())
# {'cookies': {'foo': 'bar'}}

curl_cffi supports the same browser versions as supported by my fork of curl-impersonate:

However, only Chrome-like browsers are supported. Firefox support is tracked in #59.

Browser versions will be added only when their fingerprints change. If you see a version, e.g. chrome122, were skipped, you can simply impersonate it with your own headers and the previous version.

If you are trying to impersonate a target other than a browser, use ja3=... and akamai=... to specify your own customized fingerprints. See the docs on impersonatation for details.

  • chrome99
  • chrome100
  • chrome101
  • chrome104
  • chrome107
  • chrome110
  • chrome116 [1]
  • chrome119 [1]
  • chrome120 [1]
  • chrome123 [3]
  • chrome124 [3]
  • chrome99_android
  • edge99
  • edge101
  • safari15_3 [2]
  • safari15_5 [2]
  • safari17_0 [1]
  • safari17_2_ios [1]

Notes:

  1. Added in version 0.6.0.
  2. Fixed in version 0.6.0, previous http2 fingerprints were not correct.
  3. Added in version 0.7.0.

asyncio

from cycurl.requests import AsyncSession

async with AsyncSession() as s:
    r = await s.get("https://example.com")

More concurrency:

import asyncio
from cycurl.requests import AsyncSession

urls = [
    "https://google.com/",
    "https://facebook.com/",
    "https://twitter.com/",
]

async with AsyncSession() as s:
    tasks = []
    for url in urls:
        task = s.get(url)
        tasks.append(task)
    results = await asyncio.gather(*tasks)

WebSockets

from curl_cffi.requests import Session, WebSocket

def on_message(ws: WebSocket, message):
    print(message)

with Session() as s:
    ws = s.ws_connect(
        "wss://api.gemini.com/v1/marketdata/BTCUSD",
        on_message=on_message,
    )
    ws.run_forever()

curl-like

Alternatively, you can use the low-level curl-like API:

from cycurl import Curl, CurlOpt
from io import BytesIO

buffer = BytesIO()
c = Curl()
c.setopt(CURLOPT_URL, b'https://tls.browserleaks.com/json')
c.setopt(CURLOPT_WRITEDATA, buffer)

c.impersonate("chrome110")

c.perform()
c.close()
body = buffer.getvalue()
print(body.decode())

See the docs for more details.

scrapy

If you are using scrapy, check out these middlewares:

For low-level APIs, Scrapy integration and other advanced topics, see the docs for more details.

Acknowledgement

  • Originally forked from multippt/python_curl_cffi, which is under the MIT license.
  • Headers/Cookies files are copied from httpx, which is under the BSD license.
  • Asyncio support is inspired by Tornado's curl http client.
  • The WebSocket API is inspired by websocket_client.

[Sponsor] Bypass Cloudflare with API

Yes Captcha!

Yescaptcha is a proxy service that bypasses Cloudflare and uses the API interface to obtain verified cookies (e.g. cf_clearance). Click here to register: https://yescaptcha.com/i/stfnIO

[Sponsor] ScrapeNinja

Scrape Ninja

ScrapeNinja is a web scraping API with two engines: fast, with high performance and TLS fingerprint; and slower with a real browser under the hood.

ScrapeNinja handles headless browsers, proxies, timeouts, retries, and helps with data extraction, so you can just get the data in JSON. Rotating proxies are available out of the box on all subscription plans.

Sponsor

Buy Me A Coffee

Citation

If you find this project useful, please cite it as below:

@software{Kong2023,
  author = {Yifei Kong},
  title = {curl_cffi - A Python HTTP client for impersonating browser TLS and HTTP/2 fingerprints},
  year = {2023},
  publisher = {GitHub},
  journal = {GitHub repository},
  url = {https://github.com/yifeikong/curl_cffi},
}

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cycurl-0.7.0.tar.gz (50.0 MB view details)

Uploaded Source

Built Distributions

cycurl-0.7.0-cp312-cp312-win_amd64.whl (5.6 MB view details)

Uploaded CPython 3.12 Windows x86-64

cycurl-0.7.0-cp312-cp312-manylinux2014_x86_64.whl (6.9 MB view details)

Uploaded CPython 3.12

cycurl-0.7.0-cp312-cp312-macosx_14_0_arm64.whl (3.5 MB view details)

Uploaded CPython 3.12 macOS 14.0+ ARM64

cycurl-0.7.0-cp312-cp312-macosx_12_0_x86_64.whl (3.9 MB view details)

Uploaded CPython 3.12 macOS 12.0+ x86-64

cycurl-0.7.0-cp311-cp311-win_amd64.whl (5.6 MB view details)

Uploaded CPython 3.11 Windows x86-64

cycurl-0.7.0-cp311-cp311-manylinux2014_x86_64.whl (6.9 MB view details)

Uploaded CPython 3.11

cycurl-0.7.0-cp311-cp311-macosx_14_0_arm64.whl (3.5 MB view details)

Uploaded CPython 3.11 macOS 14.0+ ARM64

cycurl-0.7.0-cp311-cp311-macosx_12_0_x86_64.whl (3.9 MB view details)

Uploaded CPython 3.11 macOS 12.0+ x86-64

cycurl-0.7.0-cp310-cp310-win_amd64.whl (5.6 MB view details)

Uploaded CPython 3.10 Windows x86-64

cycurl-0.7.0-cp310-cp310-manylinux2014_x86_64.whl (6.9 MB view details)

Uploaded CPython 3.10

cycurl-0.7.0-cp310-cp310-macosx_14_0_arm64.whl (3.5 MB view details)

Uploaded CPython 3.10 macOS 14.0+ ARM64

cycurl-0.7.0-cp310-cp310-macosx_12_0_x86_64.whl (3.7 MB view details)

Uploaded CPython 3.10 macOS 12.0+ x86-64

cycurl-0.7.0-cp39-cp39-win_amd64.whl (5.6 MB view details)

Uploaded CPython 3.9 Windows x86-64

cycurl-0.7.0-cp39-cp39-manylinux2014_x86_64.whl (6.9 MB view details)

Uploaded CPython 3.9

cycurl-0.7.0-cp39-cp39-macosx_14_0_arm64.whl (3.5 MB view details)

Uploaded CPython 3.9 macOS 14.0+ ARM64

cycurl-0.7.0-cp39-cp39-macosx_12_0_x86_64.whl (3.7 MB view details)

Uploaded CPython 3.9 macOS 12.0+ x86-64

cycurl-0.7.0-cp38-cp38-win_amd64.whl (5.6 MB view details)

Uploaded CPython 3.8 Windows x86-64

cycurl-0.7.0-cp38-cp38-manylinux2014_x86_64.whl (6.9 MB view details)

Uploaded CPython 3.8

cycurl-0.7.0-cp38-cp38-macosx_14_0_arm64.whl (3.5 MB view details)

Uploaded CPython 3.8 macOS 14.0+ ARM64

cycurl-0.7.0-cp38-cp38-macosx_12_0_x86_64.whl (3.7 MB view details)

Uploaded CPython 3.8 macOS 12.0+ x86-64

File details

Details for the file cycurl-0.7.0.tar.gz.

File metadata

  • Download URL: cycurl-0.7.0.tar.gz
  • Upload date:
  • Size: 50.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.10.14

File hashes

Hashes for cycurl-0.7.0.tar.gz
Algorithm Hash digest
SHA256 dc868e4314d52da07dea5f04798f4d96e72d154ff2102026c433fd76aff6a0f0
MD5 463918819f0e75e237703920eb4cb179
BLAKE2b-256 48a5e211d75f30a443b08f7e01f4a23c1b639524a9678448fc942df748da5bd3

See more details on using hashes here.

File details

Details for the file cycurl-0.7.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: cycurl-0.7.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 5.6 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.4

File hashes

Hashes for cycurl-0.7.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 1b3c6c079c55ee34d2119c81a6cf87727621734ea956955e97dd7d8ebad5ac2c
MD5 0bf79d9dabbf70404f1b666196d93abb
BLAKE2b-256 3b1e4afbfe70cd925ebb3e798b032f50b45398b6e503567cc2956834c4158aeb

See more details on using hashes here.

File details

Details for the file cycurl-0.7.0-cp312-cp312-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cycurl-0.7.0-cp312-cp312-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 945d4b46abb320e05b21105def5331d2375d9cafea79baaaa2fba2f41c4c4a14
MD5 7c9a0d9907c4751724d9710a333cfa80
BLAKE2b-256 afcdb46c1ee88878399fab1cda8af0193ccb9ae71d361e79bd536ddac14595ca

See more details on using hashes here.

File details

Details for the file cycurl-0.7.0-cp312-cp312-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for cycurl-0.7.0-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 b625c38edd24cd08ab7e0404dbeefcd2645e7769cea25404b4eaac5f29d8dc62
MD5 998ea9ff1573f16ae35af1a14bfacd48
BLAKE2b-256 25fe391b0fa33120be60ddc69b307c484aa9553b98c7bffdc49a0be0c586999f

See more details on using hashes here.

File details

Details for the file cycurl-0.7.0-cp312-cp312-macosx_12_0_x86_64.whl.

File metadata

File hashes

Hashes for cycurl-0.7.0-cp312-cp312-macosx_12_0_x86_64.whl
Algorithm Hash digest
SHA256 50f133569b534b9288c3d04960e427969c347dec2b9a8b4b5d5d8264552eb485
MD5 567fa7c98ae56dce0de3f41da8b66cab
BLAKE2b-256 4568d06afe571294c348c517d456753e4d9013d26c6c4390a9ba8b9b86288612

See more details on using hashes here.

File details

Details for the file cycurl-0.7.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: cycurl-0.7.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 5.6 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.11.9

File hashes

Hashes for cycurl-0.7.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 922cc533d56bb8feb25a3c63ca17e641ce1d20495e383301d7b97d6828e88dea
MD5 0c4e4c5b90b0acd80490986ee3ba3232
BLAKE2b-256 2b757cd5ede827af4af3cdc2c4d2d49726871ced67077e7a608ff87a9999d141

See more details on using hashes here.

File details

Details for the file cycurl-0.7.0-cp311-cp311-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cycurl-0.7.0-cp311-cp311-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c12d79e37f45a6046de09f64215e25b58061c7f2189e9a1dec111621773f7101
MD5 a82e0949c4a5f1df573368c2e94988fa
BLAKE2b-256 4ecc8c6825d085de8a9ae546e4c9c48ea1b7a42f7e9c8e6c8514f084d8a69737

See more details on using hashes here.

File details

Details for the file cycurl-0.7.0-cp311-cp311-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for cycurl-0.7.0-cp311-cp311-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 9b4a76f76f8f8f65caca6b2f7f642cd9eb9079dd9f22d6d24461191341050311
MD5 ea9dc74378998dfc69374f35a78c2afb
BLAKE2b-256 a10f35843b3434af89570e5d2249ed871df1b732ac8f274788f04c97cc64ddf6

See more details on using hashes here.

File details

Details for the file cycurl-0.7.0-cp311-cp311-macosx_12_0_x86_64.whl.

File metadata

File hashes

Hashes for cycurl-0.7.0-cp311-cp311-macosx_12_0_x86_64.whl
Algorithm Hash digest
SHA256 011781f3d2a0a29dc3d4def7ea62eaf6cc6ceed94e1ee2f5a52bd8729d018b56
MD5 510615b96a6c64c29875a4f8cd489564
BLAKE2b-256 7b29696eb7251874e25ed8f0236301e12794f834e9db87d9f258752ff9aaebc8

See more details on using hashes here.

File details

Details for the file cycurl-0.7.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: cycurl-0.7.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 5.6 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.10.11

File hashes

Hashes for cycurl-0.7.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 1f5b5c7eb152a632551720465cd89469ff6b12457cf0671059cf4b03c4dace76
MD5 7092cc9ffaaa396a212d97dcb0eadbf8
BLAKE2b-256 6531d69e6a6a00b01b3da7e033786549cd6d73e9654fcd41fd5e62407d96253c

See more details on using hashes here.

File details

Details for the file cycurl-0.7.0-cp310-cp310-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cycurl-0.7.0-cp310-cp310-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a206115ded8eca0f7e14945606eb12566051695f6dd2417bfacff9c99ace655f
MD5 72ca75a36dd7d1bb4d48ea7f5b652cff
BLAKE2b-256 c60d296a577fe77ccfb5e8c55b5a0caf088a78366aa0dc8babc90edf8c62c7b6

See more details on using hashes here.

File details

Details for the file cycurl-0.7.0-cp310-cp310-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for cycurl-0.7.0-cp310-cp310-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 e2476247f056e405510ddda75e70b5f6c3fba4fb58e90c067300a9c77f154d69
MD5 c669ddfc6b3708f1da21620d77e40618
BLAKE2b-256 90b47fdc70f415aa567e127ea8fb9b4596089eaeea0ac31cd6fe7bdeea0f5c7f

See more details on using hashes here.

File details

Details for the file cycurl-0.7.0-cp310-cp310-macosx_12_0_x86_64.whl.

File metadata

File hashes

Hashes for cycurl-0.7.0-cp310-cp310-macosx_12_0_x86_64.whl
Algorithm Hash digest
SHA256 32eea462a435f6a1b934e26071ad24829e76e8eb2ff2b2c7ea6d54e17bb2902a
MD5 876987cb6e7067d99b3cb714950f3f20
BLAKE2b-256 af4f069b8b2efb77c27fc64d0f05991f43e3d56bda17e35741a8a00a967a26ba

See more details on using hashes here.

File details

Details for the file cycurl-0.7.0-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: cycurl-0.7.0-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 5.6 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.13

File hashes

Hashes for cycurl-0.7.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 fc5e22acd319511243c868aaf501b6e4f7705c06336e55043ddb63f53f274407
MD5 7343f56791b423c774e79500e7128abb
BLAKE2b-256 b3e587364a6d55e0781a51409f4a28659f05e051c80d754026a49683aa69becd

See more details on using hashes here.

File details

Details for the file cycurl-0.7.0-cp39-cp39-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cycurl-0.7.0-cp39-cp39-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e230308886c231e452d4bda3286b41c840fd4a0ef13b8dd2660e4d198321d789
MD5 bc00df8466c55a9a51b3f3329f9d3598
BLAKE2b-256 04416708a3445a97f82c0e01a3015b2cfffca5ec7681b666f6521dd8bd1fa722

See more details on using hashes here.

File details

Details for the file cycurl-0.7.0-cp39-cp39-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for cycurl-0.7.0-cp39-cp39-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 409c7ea493b9abe875d7ef1e9e7fcf83acd511513eaca8882f9d2ff6d90e5768
MD5 7f66c3bc770ed686e6080a6ef28ecbec
BLAKE2b-256 fde315a1bee7e1da9449a79ae1baedb20be5d2a4fdf3bc24cc6a9c3a66059124

See more details on using hashes here.

File details

Details for the file cycurl-0.7.0-cp39-cp39-macosx_12_0_x86_64.whl.

File metadata

File hashes

Hashes for cycurl-0.7.0-cp39-cp39-macosx_12_0_x86_64.whl
Algorithm Hash digest
SHA256 b0492797361fdcf0fe851d554ba608fc3505d45d00fc343e014e016568c1fd4c
MD5 22fe7d348250c0e4d6be1d64f40d37af
BLAKE2b-256 f77a6a2d6e54725b551746ffbf213eba03469ddff521c646cbe2833238e01bc7

See more details on using hashes here.

File details

Details for the file cycurl-0.7.0-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: cycurl-0.7.0-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 5.6 MB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.8.10

File hashes

Hashes for cycurl-0.7.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 aee5f67a8232edcd59831eca4375bb224b2030a74f439517f5842775b542f7f5
MD5 7fc2a62f9730fd70aad4de8f7bd768e9
BLAKE2b-256 4527b73486afdd020dfe5fad8bc37f168f716b91c38d1ed184a1696190cacd6c

See more details on using hashes here.

File details

Details for the file cycurl-0.7.0-cp38-cp38-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for cycurl-0.7.0-cp38-cp38-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9485177c0d744f33ca98b566f16cf30a33a58837baf99a47c8a5438663d24b77
MD5 50a6ba8e8328252efaf226a6255ddd7a
BLAKE2b-256 4a4a52df761b27663d1ff7e2cacaa8663de21a312c72dc8f99341ab0f8a9675e

See more details on using hashes here.

File details

Details for the file cycurl-0.7.0-cp38-cp38-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for cycurl-0.7.0-cp38-cp38-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 23be0cddd8e64e1731f226628fe8d775afd3ec38ee6a226b2c8ad43518e3a009
MD5 cf1be3ee22cad9451bc2894885dec4c3
BLAKE2b-256 90e9cf4e407fb7097ca241819e70596bbd8552850934a2321796076870cb9428

See more details on using hashes here.

File details

Details for the file cycurl-0.7.0-cp38-cp38-macosx_12_0_x86_64.whl.

File metadata

File hashes

Hashes for cycurl-0.7.0-cp38-cp38-macosx_12_0_x86_64.whl
Algorithm Hash digest
SHA256 db574d4f217339acc91f770ea21ad96cd0bcbc16ef55361a409f36fbd12c7d70
MD5 f5b401034c650ff3bc373f48736acac5
BLAKE2b-256 03a1b62c6a9ecedc762fe777a17ed69884746701baf77b093036ea5b358d9109

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page