Code Examples

Ready-to-use code examples in multiple programming languages.

C# Examples

Basic Request

using System;
using System.Net.Http;
using System.Threading.Tasks;

public class BassodeClient
{
    private readonly HttpClient _httpClient;
    private const string BaseUrl = "https://api.bassode.com";

    public BassodeClient(string apiKey, string apiSecret)
    {
        _httpClient = new HttpClient();
        _httpClient.DefaultRequestHeaders.Add("X-Api-Key", apiKey);
        _httpClient.DefaultRequestHeaders.Add("X-Api-Secret", apiSecret);
    }

    public async Task<string> GetSpeakersAsync()
    {
        var response = await _httpClient.GetAsync($"{BaseUrl}/api/speakers");
        response.EnsureSuccessStatusCode();
        return await response.Content.ReadAsStringAsync();
    }
}

// Usage
var client = new BassodeClient("bsk_live_xxxxxx", "your_secret");
var speakers = await client.GetSpeakersAsync();
Console.WriteLine(speakers);

Strongly Typed Client

using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;

public class Speaker
{
    public string Id { get; set; }
    public string Brand { get; set; }
    public string Model { get; set; }
    public decimal Price { get; set; }
}

public class SpeakersResponse
{
    public List<Speaker> Speakers { get; set; }
    public Pagination Pagination { get; set; }
}

public class Pagination
{
    public int Page { get; set; }
    public int PageSize { get; set; }
    public int TotalCount { get; set; }
    public int TotalPages { get; set; }
}

public class BassodeClient
{
    private readonly HttpClient _httpClient;

    public BassodeClient(string apiKey, string apiSecret)
    {
        _httpClient = new HttpClient
        {
            BaseAddress = new Uri("https://api.bassode.com")
        };
        _httpClient.DefaultRequestHeaders.Add("X-Api-Key", apiKey);
        _httpClient.DefaultRequestHeaders.Add("X-Api-Secret", apiSecret);
    }

    public async Task<SpeakersResponse> GetSpeakersAsync(
        int page = 1, 
        int pageSize = 50, 
        string brand = null)
    {
        var url = $"/api/speakers?page={page}&pageSize={pageSize}";
        if (!string.IsNullOrEmpty(brand))
            url += $"&brand={brand}";

        var response = await _httpClient.GetAsync(url);
        response.EnsureSuccessStatusCode();
        
        var json = await response.Content.ReadAsStringAsync();
        return JsonSerializer.Deserialize<SpeakersResponse>(json);
    }
}

// Usage
var client = new BassodeClient("bsk_live_xxxxxx", "your_secret");
var response = await client.GetSpeakersAsync(page: 1, pageSize: 20, brand: "Klipsch");

foreach (var speaker in response.Speakers)
{
    Console.WriteLine($"{speaker.Brand} {speaker.Model} - ${speaker.Price}");
}

JavaScript Examples

Fetch API

const API_KEY = 'bsk_live_xxxxxx';
const API_SECRET = 'your_secret';
const BASE_URL = 'https://api.bassode.com';

async function getSpeakers() {
  const response = await fetch(`${BASE_URL}/api/speakers`, {
    headers: {
      'X-Api-Key': API_KEY,
      'X-Api-Secret': API_SECRET
    }
  });

  if (!response.ok) {
    throw new Error(`HTTP error! status: ${response.status}`);
  }

  const data = await response.json();
  return data;
}

// Usage
getSpeakers()
  .then(data => {
    console.log('Speakers:', data.speakers);
    console.log('Total count:', data.pagination.totalCount);
  })
  .catch(error => console.error('Error:', error));

Axios

const axios = require('axios');

const bassodeClient = axios.create({
  baseURL: 'https://api.bassode.com',
  headers: {
    'X-Api-Key': 'bsk_live_xxxxxx',
    'X-Api-Secret': 'your_secret'
  }
});

// Get speakers
async function getSpeakers(params = {}) {
  try {
    const response = await bassodeClient.get('/api/speakers', { params });
    return response.data;
  } catch (error) {
    console.error('Error fetching speakers:', error.response?.data || error.message);
    throw error;
  }
}

// Usage
const speakers = await getSpeakers({ 
  brand: 'Klipsch', 
  page: 1, 
  pageSize: 20 
});

speakers.speakers.forEach(speaker => {
  console.log(`${speaker.brand} ${speaker.model} - $${speaker.price}`);
});

React Hook

import { useState, useEffect } from 'react';

const API_KEY = process.env.REACT_APP_BASSODE_API_KEY;
const API_SECRET = process.env.REACT_APP_BASSODE_API_SECRET;

function useSpeakers(filters = {}) {
  const [speakers, setSpeakers] = useState([]);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);

  useEffect(() => {
    async function fetchSpeakers() {
      try {
        setLoading(true);
        const params = new URLSearchParams(filters);
        const response = await fetch(
          `https://api.bassode.com/api/speakers?${params}`,
          {
            headers: {
              'X-Api-Key': API_KEY,
              'X-Api-Secret': API_SECRET
            }
          }
        );

        if (!response.ok) throw new Error('Failed to fetch speakers');

        const data = await response.json();
        setSpeakers(data.speakers);
      } catch (err) {
        setError(err.message);
      } finally {
        setLoading(false);
      }
    }

    fetchSpeakers();
  }, [JSON.stringify(filters)]);

  return { speakers, loading, error };
}

// Usage in component
function SpeakerList() {
  const { speakers, loading, error } = useSpeakers({ brand: 'Klipsch' });

  if (loading) return <div>Loading...</div>;
  if (error) return <div>Error: {error}</div>;

  return (
    <ul>
      {speakers.map(speaker => (
        <li key={speaker.id}>
          {speaker.brand} {speaker.model} - ${speaker.price}
        </li>
      ))}
    </ul>
  );
}

Python Examples

Requests Library

import requests
import os

API_KEY = os.getenv('BASSODE_API_KEY')
API_SECRET = os.getenv('BASSODE_API_SECRET')
BASE_URL = 'https://api.bassode.com'

class BassodeClient:
    def __init__(self, api_key, api_secret):
        self.session = requests.Session()
        self.session.headers.update({
            'X-Api-Key': api_key,
            'X-Api-Secret': api_secret
        })
        self.base_url = BASE_URL

    def get_speakers(self, **params):
        response = self.session.get(f'{self.base_url}/api/speakers', params=params)
        response.raise_for_status()
        return response.json()

    def get_speaker(self, speaker_id):
        response = self.session.get(f'{self.base_url}/api/speakers/{speaker_id}')
        response.raise_for_status()
        return response.json()

# Usage
client = BassodeClient(API_KEY, API_SECRET)

# Get speakers with filters
speakers_data = client.get_speakers(brand='Klipsch', page=1, pageSize=20)

for speaker in speakers_data['speakers']:
    print(f"{speaker['brand']} {speaker['model']} - ${speaker['price']}")

With Error Handling

import requests
from typing import Dict, List, Optional

class BassodeError(Exception):
    """Base exception for Bassode API errors"""
    pass

class BassodeClient:
    def __init__(self, api_key: str, api_secret: str):
        self.session = requests.Session()
        self.session.headers.update({
            'X-Api-Key': api_key,
            'X-Api-Secret': api_secret
        })
        self.base_url = 'https://api.bassode.com'

    def _request(self, method: str, endpoint: str, **kwargs) -> Dict:
        url = f'{self.base_url}{endpoint}'
        
        try:
            response = self.session.request(method, url, **kwargs)
            response.raise_for_status()
            return response.json()
        except requests.exceptions.HTTPError as e:
            error_msg = e.response.json().get('message', str(e))
            raise BassodeError(f"API Error: {error_msg}") from e
        except requests.exceptions.RequestException as e:
            raise BassodeError(f"Request failed: {str(e)}") from e

    def get_speakers(
        self, 
        page: int = 1, 
        page_size: int = 50,
        brand: Optional[str] = None,
        min_price: Optional[float] = None,
        max_price: Optional[float] = None
    ) -> Dict:
        params = {'page': page, 'pageSize': page_size}
        if brand:
            params['brand'] = brand
        if min_price is not None:
            params['minPrice'] = min_price
        if max_price is not None:
            params['maxPrice'] = max_price
            
        return self._request('GET', '/api/speakers', params=params)

# Usage with error handling
try:
    client = BassodeClient(API_KEY, API_SECRET)
    data = client.get_speakers(brand='Klipsch', min_price=400, max_price=800)
    
    print(f"Found {data['pagination']['totalCount']} speakers")
    for speaker in data['speakers']:
        print(f"  {speaker['brand']} {speaker['model']} - ${speaker['price']}")
        
except BassodeError as e:
    print(f"Error: {e}")

cURL Examples

Get Speakers

curl https://api.bassode.com/api/speakers \
  -H "X-Api-Key: bsk_live_xxxxxx" \
  -H "X-Api-Secret: your_secret"

Get Speakers with Filters

curl "https://api.bassode.com/api/speakers?brand=Klipsch&page=1&pageSize=20" \
  -H "X-Api-Key: bsk_live_xxxxxx" \
  -H "X-Api-Secret: your_secret"

Get Single Speaker

curl https://api.bassode.com/api/speakers/123 \
  -H "X-Api-Key: bsk_live_xxxxxx" \
  -H "X-Api-Secret: your_secret"

Get Recommendations (POST)

curl -X POST https://api.bassode.com/api/recommendations \
  -H "X-Api-Key: bsk_live_xxxxxx" \
  -H "X-Api-Secret: your_secret" \
  -H "Content-Type: application/json" \
  -d '{
    "budget": 1500,
    "preferences": {
      "roomSize": "medium",
      "musicGenres": ["rock", "jazz"]
    }
  }'

Environment Variables

It's best practice to store your API credentials in environment variables:

Unix/Linux/macOS

# In ~/.bashrc or ~/.zshrc
export BASSODE_API_KEY="bsk_live_xxxxxx"
export BASSODE_API_SECRET="your_secret"

# Or in .env file
echo "BASSODE_API_KEY=bsk_live_xxxxxx" > .env
echo "BASSODE_API_SECRET=your_secret" >> .env

Windows (PowerShell)

# Set for current session
$env:BASSODE_API_KEY = "bsk_live_xxxxxx"
$env:BASSODE_API_SECRET = "your_secret"

# Set permanently
[System.Environment]::SetEnvironmentVariable('BASSODE_API_KEY', 'bsk_live_xxxxxx', 'User')
[System.Environment]::SetEnvironmentVariable('BASSODE_API_SECRET', 'your_secret', 'User')

.NET (appsettings.json)

{
  "BassodeApi": {
    "ApiKey": "bsk_live_xxxxxx",
    "ApiSecret": "your_secret",
    "BaseUrl": "https://api.bassode.com"
  }
}

Error Handling Examples

JavaScript

async function getSpeakers() {
  try {
    const response = await fetch('https://api.bassode.com/api/speakers', {
      headers: {
        'X-Api-Key': API_KEY,
        'X-Api-Secret': API_SECRET
      }
    });

    if (!response.ok) {
      const error = await response.json();
      throw new Error(error.message || `HTTP ${response.status}`);
    }

    return await response.json();
  } catch (error) {
    if (error.message.includes('401')) {
      console.error('Authentication failed. Check your API credentials.');
    } else if (error.message.includes('403')) {
      console.error('Insufficient permissions. Check your API key scopes.');
    } else if (error.message.includes('429')) {
      console.error('Rate limit exceeded. Please wait before retrying.');
    } else {
      console.error('Request failed:', error.message);
    }
    throw error;
  }
}

Next Steps