SellApp for Elixir

Read your SellApp catalog, build a checkout, or bring order data into your Elixir app. This SDK is the library that makes those API requests and gives you Elixir structs back, wrapped in {:ok, result} or {:error, error} tuples.

We'll start with one product and print its name. One request, one useful result, and no changes to your store. Already know the basics? Jump to configuration or the method index.

Install

Add the Hex package to your application's mix.exs dependency list:

{:sellapp, "~> 0.1.1"}

Then run mix deps.get to download the SDK and its dependencies.

The package declares Elixir ~> 1.15. Native validation runs on Elixir 1.20.4 with OTP 28.4; the declared minimum and an independent minimum OTP version have not been verified. Use a compatible Erlang/OTP installation and Mix.

If you are starting a new application, run mix new sellapp_example and cd sellapp_example before adding the dependency above.

Your first request

Let's ask your store for one product. You need a secret API key with the listing ability (permission to read the catalog), plus your store slug. For launch-lab.sell.app, the slug is launch-lab.

The authentication guide explains key setup and access rules. Keep the key on your server and out of Git.

Save this complete program as first-request.exs in your application's root directory. It builds the client, requests one product, and prints the result:

base_url = System.fetch_env!("SELLAPP_API_BASE_URL")
if base_url == "", do: raise("Set SELLAPP_API_BASE_URL before running this example")
client = SellApp.client(base_url: base_url)
# Credentials come from SELLAPP_API_KEY and SELLAPP_STORE.
{:ok, page} = SellApp.Products.list(client, %{limit: 1})
Enum.each(page.data, fn product -> IO.puts("#{product.id} #{product.title}") end)
if page.data == [], do: IO.puts("No products yet. The request worked!")

Replace the key and store below, then run these commands from your application in a Bash-compatible terminal. The export lines set environment variables: values the script reads without keeping secrets in its source code.

export SELLAPP_API_KEY='replace-with-your-key'
export SELLAPP_STORE='launch-lab'
export SELLAPP_API_BASE_URL='https://sell.app/api'
mix run first-request.exs

This endpoint reads your real store without changing it. SELLAPP_API_BASE_URL is an example variable passed explicitly to the client, not a built-in SDK setting. Use SELLAPP_STORE consistently across the API guides.

You should see a product ID and title from your own store. If the store is empty, you'll see the success message instead. The connection still worked.

The {:ok, page} match unwraps a successful result. Here, page is a SellApp.Page and page.data is its list of product structs. This first script deliberately stops if the request fails; the error example below handles failures with case. Struct fields use snake_case; date-time fields remain ISO 8601 strings.

Account access and first-store setup

Create a user-owned key in API keys, even before you have a store. Enable account:read for identity, store discovery and permission inspection, and stores:create separately for store creation. Identity, discovery, store detail by ID and creation omit X-STORE; permission inspection and business requests select a store explicitly.

An unrestricted key covers current and future accessible stores. A selected-store key covers only its fixed list; an empty list covers none. Membership and role changes still apply. Selected-store keys cannot create stores. Existing keys do not gain abilities automatically; * satisfies the new abilities while retaining membership, role and restriction checks.

The account guide shows first-store creation, required idempotency keys, and bounded reads across several stores with partial failures. Creation returns an ID and slug; use the slug for subsequent product requests. Find your language's methods in the resource reference. CLI and MCP connections retain browser OAuth.

If the request fails

Result Next step
Empty product list The read succeeded. Create a product when you are ready.
401 Check the selected credential and whether it has expired or been revoked.
403 Check the key's listing ability, selected-store restrictions and the account's current store permissions. Official CLI OAuth also requires its active grant.
400 with a missing-store message Set SELLAPP_STORE to an authorized store slug.
429 Follow Retry-After and the SDK's documented retry behavior.

Keep the request ID when reporting an API failure. Never include credentials.

Three useful next actions

  1. Create and edit a product: exact signatures and complete examples.
  2. Read orders or create a checkout: inspect permissions and effects before changing a purchase.
  3. Read more than one page: pagination, request controls, errors, and retry behavior.

Reference and examples

Support and releases

Find available packages and installation instructions in the SDK guide. Report an SDK issue. Include the SDK version, runtime version, and a redacted reproduction. Licensed under MIT; see third-party notices.