Return to HamDash

Developer API

Developers, we would love for you to interface with HamDash!

When saving a QSO, simply send a JSON-encoded POST request to https://hamdash.affirmatech.net/api/standing to display your station’s score on the scoreboard!

To obtain a free API key, please request one using the Affirmatech Contact Form. Please include your name, e-mail address, and application name and we send a key to the e-mail provided.

Minimum JSON Payload Example

The following is the minimum required to accept a standing upload (but we recommend sending as many fields as possible):

{
  "contest": "CQ-WPX-SSB",
  "score": 1740060,
  "operator": {
    "callsign": "N3FJP"
  },
  "totalQsos": 1090,                      // Not required but an excellent statistic
  "firstQsoDate": "2023/03/25 09:01:50Z"  // Not required but greatly encouraged if available
}
Field Type Description
contest string Either the cabrillo name or full contest name. See this list for reference.
score number Numeric total score
operator.callsign string Callsign of operating station
totalQsos number QSO Count Total
firstQsoDate ISO 8601 Date Date of first QSO if available. Helps ensure score is linked with the correct contest session.
Note that in ISO format, the trailing “Z” denotes UTC time.

Full JSON Payload Example

The following example includes every available field:

{
  "contest": "CQ-WPX-SSB",
  "score": 1740060,
  "operator": {
    "callsign": "N3FJP",
    "band": "20",   // Uses ADIF Specification.  Assumes "m" suffix if omitted
    "mode": "SSB",
    "rate20": 3,    // QSOs per hr over last 20 minutes (total QSOs within last 20 min * 3)
    "rate60": 1,    // QSOs per hr over last 60 minutes
    "frequency": 14.2545,
    "name": "Scott"
  },
  "multiplierCount": 630,
  "totalQsos": 1090,
  "totalQsoPoints": 2762,   // Score before multipliers
  "club": {
    "name": "Northeast Maryland Amateur Radio Contest Society"  // HamDash will create the club if needed
  },
  "software": "N3FJP",
  "softwareVersion": "N3FJP's CQ WPX Contest Log 4.9.7",
  "stationCategory": "FIXED",   
  "bandCategory": "ALL",
  "modeCategory": "SSB",
  "assistedCategory": "ASSISTED",
  "transmittersCategory": "ONE",
  "powerCategory": "HIGH",
  "opsCategory": "SINGLE-OP",
  "overlayCategory": "N/A",
  "totalOpTime": "24:54:51",    // N3FJP Software omits breaks more than 30 minutes
  "avgQsHr": "43.8",            // Calculated by HamDash if totalOpTime provided
  "firstQsoDate": "2023/03/25 09:01:50Z",
  "latitude": 40,
  "longitude": -76.8,
  "continent": "NA",
  "dxcc": 291,
  "country": "USA",     // Please use dxcc if possible
  "state": "MD",
  "section": "MDC",
  "cqZone": 5,
  "ituZone": 8,
  "lastQso": {
    "date": "2023/03/26 22:00:59Z",
    "callsign": "HK3C",
    "country": "Colombia",  // Please use dxcc if possible
    "dxcc": 116,
    "state": "",
    "section": "",
    "cqZone": 9,
    "ituZone": 12,
    "prefix": "HK3",
    "latitude": 5,
    "longitude": -74,
    "band": "20",
    "mode": "SSB",
    "continent": "SA",
    "transmitterId": 0,     // Transmitter that made the QSO in multi-transmitter setups
    "frequency": 14.2545
  }
}
  • We suggest sending as much information as possible although not all fields are required such as club and lastQso. Optional fields can be omitted if not available.
  • For operator.band and lastQso.band please follow the ADIF Band Specification. We will append “m” if a suffix is not present
  • For Category values, please follow the Cabrillo Specification
  • Currently for country fields, dxcc and lastQso.dxcc are used instead of country and lastQso.country.

Upload Strategy

Our recommendation is to send a standing update when:

  • The user opens the software (even if no score as it is good to see who will be participating).
  • The user enters a QSO record.
  • The user edits or deletes a record, causing a score change.

If the contest session has not yet started, the station will be added to the scoreboard with a score of zero regardless of the score sent. A contest session will accept standing updates up to 1 hour after contest end.

Currently open browser windows will see a welcome message for the first upload of a station. New QSOs will be displayed in the feed while the contest is active.

We will maintain an active Test contest for your development and experimentation. Set contest to "TEST" to send uploads to the test contest.

Example Implementation

Here is some example C# code for uploading to HamDash:

public static async Task<string> SendScoreToHamDash(
    HamDashScorePOST data, string endpoint = "https://hamdash.affirmatech.com/api/standing")
{
    try
    {
        using (var client = new HttpClient())
        {
            var serializedBody = JsonConvert.SerializeObject(data);
            var content = new StringContent(serializedBody, Encoding.UTF8, "application/json");
            client.DefaultRequestHeaders.Add("headerName", "headerValue");  // API Key goes here
            var response = await client.PostAsync(endpoint, content);
            return ((int)response.StatusCode) + ": " + response.StatusCode.ToString() + 
                "\r\n\r\n" + await response.Content.ReadAsStringAsync();
        }
    }
    catch (Exception e)
    {              
        return e.Message;
    }
}

public class LastQSO     // Values of station worked
{
    public string date;
    public string callsign;  // Callsign of last station worked
    public string country;
    public int dxcc;
    public string state;
    public string section;
    public int cqZone;
    public int ituZone;
    public string prefix;
    public double latitude;
    public double longitude;
    public string band = ""  // (80, 40, etc.)
    public string mode = ""  // (CW, SSB, etc.)
    public string continent;
    public int transmitterId = 0;  // Transmitter that made the QSO in multi-transmitter setups
    public double frequency;
}

public class Club
{
    public string name;
}

public class Operator
{
    public string callsign = "";  // Callsign of uploading station
    public string band = ""; // Current band
    public string mode =  ""; // Current mode
    public int rate20 = 0; // Number of QSOs last 20 minutes * 3
    public int rate60 = 0; // Number of QSOs last 60 minutes
    public double frequency = 0; //Optional - Current frequency in MHz (21.446)
    public string name = "";
}

public class HamDashScorePOST
{      
    // Cabrillo contest name derived from WA7BNM Contest Calendar.  Use TEST for test contest. 
    public string contest = "";
    public int score;  // Required - The total score
    public Operator @operator = new Operator();
    public int multiplierCount;  // Total multipliers
    public int totalQsos = 0; // Total QSOs
    public int totalQsoPoints = 0; // Score before multipliers
    public Club club = new Club();
    public string software = "";  // Software family (N3FJP, etc.)
    public string softwareVersion = "";  // Program name and version (ARRL DX Contest Log 1.2.3, etc.)
    public string stationCategory =  "";  // (FIXED, etc.)
    public string bandCategory =  "";  // (ALL, 80, etc.)
    public string modeCategory = ""; // (MIXED, CW, SSB, etc.)
    public string assistedCategory = "";  // (ASSISTED or NON-ASSISTED)
    public string transmittersCategory = "";  // (ONE, etc.)
    public string powerCategory = "";   // (HIGH, LOW or QRP)
    public string opsCategory =   // (SINGLE-OP, MULTI-OP)
    public string overlayCategory = "";
    public string totalOpTime = "";  // N3FJP Software omits breaks greater than 30 minutes
    public string avgQsHr = "";  // Optional - calculated by HamDash if totalOpTime provided
    public string firstQsoDate; // Recommended ISO formatted Date of first QSO
    public double latitude;  // Latitude of posting station
    public double longitude;  // Longitude of posting station
    public string continent = "";  // Continent of posting station
    public int dxcc;  // DXCC of posting station
    public string country = ""; // Country of posting station
    public string state =  ""; // State of posting station
    public string section =  ""; // Section of posting station
    public int cqZone =  0; // CQ Zone of posting station
    public int ituZone =  0; // ITU Zone of posting station
    public LastQSO lastQso = null;
}