Skycart

A free, open-source Python package for Blackbaud's SKY API. It handles the login, token refreshes, paging, and rate limits, so a Jupyter cell can just ask Raiser's Edge for data.

From install to answers

Raiser's Edge will tell you a prospect is in Cultivation. The SKY API can tell you they've been there for 224 days. With Skycart, that's one line.

  1. Install it

    pip install "skycart[pandas] @ git+https://github.com/ngoodroe/skycart.git"
  2. Log in once, then ask for anything

    import skycart
    
    skycart.login()     # once -- opens your browser
    
    skycart.get_prospect_status("280")
    # {'status': 'Cultivation', 'days_elapsed': 224, ...}
  3. Sort a gift officer's portfolio by days in status

    assignments = skycart.get_fundraiser_assignments("123")
    ids = [a["constituent_id"] for a in assignments]
    
    statuses = skycart.to_dataframe(skycart.get_prospect_statuses(ids))
    statuses.sort_values("days_elapsed", ascending=False)

Why I built it

  • Data RE queries can't reach

    Days in prospect status, fundraiser assignments, relationships: the SKY API exposes a lot that queries and exports don't. Any endpoint is one skycart.get() away.

  • Built for notebooks

    Answers come back as plain Python data. get_all() follows the paging for you, and to_dataframe() turns any result into a pandas table.

  • Small enough to read

    Four short, commented files, so you can see exactly what it does with your credentials. Your login stays on your own computer. MIT licensed.

Want help putting it to work?

Skycart is free. If you'd like a hand getting it set up, or need something bigger built on your Raiser's Edge data, I'd like to hear about it.

Skycart isn't affiliated with or endorsed by Blackbaud. Raiser's Edge NXT and SKY API are Blackbaud trademarks.