{"openapi": "3.1.0", "info": {"title": "RGMS API", "version": "1.0.0", "description": ""}, "paths": {"/api/callsign/{call}/": {"get": {"operationId": "api_views_callsign_lookup", "summary": "Callsign Lookup", "parameters": [{"in": "path", "name": "call", "schema": {"title": "Call", "type": "string"}, "required": true}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CallsignOut"}}}}}, "description": "Look up a callsign's profile, including signup date and activity counts.\nReturns 404 if the callsign is not registered."}}, "/api/upload/": {"post": {"operationId": "api_views_log_upload", "summary": "Log Upload", "parameters": [{"in": "query", "name": "callsign", "schema": {"title": "Callsign", "type": "string"}, "required": true}, {"in": "query", "name": "replaces", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Replaces"}, "required": false}], "responses": {"201": {"description": "Created", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UploadOut"}}}}}, "description": "Upload an ADIF log file for matching. The callsign must already be\nin your profile. The file is queued for processing by the matcher.\n\nPass `replaces` (a previous upload's id, same callsign) to mark this as a\ncorrected re-upload of that log: contacts present in the old file but\nabsent from the new one are treated as corrections and deleted.", "requestBody": {"content": {"multipart/form-data": {"schema": {"properties": {"log_file": {"format": "binary", "title": "Log File", "type": "string"}}, "required": ["log_file"], "title": "FileParams", "type": "object"}}}, "required": true}, "security": [{"ApiKeyAuth": []}]}}, "/api/matches/": {"get": {"operationId": "api_views_match_list", "summary": "Match List", "parameters": [{"in": "query", "name": "page_size", "schema": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Page Size"}, "required": false}, {"in": "query", "name": "cursor", "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Cursor"}, "required": false}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PagedMatchOut"}}}}}, "description": "List confirmed matches for your callsigns, newest first.\nA match means both parties uploaded logs containing the same QSO.\nCursor-paginated: follow `next`/`previous` URLs, `page_size` up to 200.", "security": [{"ApiKeyAuth": []}]}}, "/api/matches/adif": {"get": {"operationId": "api_views_matches_adif", "summary": "Matches Adif", "parameters": [{"in": "query", "name": "since", "schema": {"default": 0, "title": "Since", "type": "integer"}, "required": false}], "responses": {"200": {"description": "OK"}}, "description": "Export confirmed matches as ADIF. Returns gzipped ADIF data.\n\nThe `since` parameter is a Unix timestamp; only matches confirmed after\nthat time are included. This allows incremental syncing \u2014 store the latest\n`matched_at` value and pass it next time.", "security": [{"ApiKeyAuth": []}]}}}, "components": {"schemas": {"CallsignOut": {"properties": {"callsign": {"title": "Callsign", "type": "string"}, "name": {"title": "Name", "type": "string"}, "country": {"title": "Country", "type": "string"}, "grid_square": {"title": "Grid Square", "type": "string"}, "latitude": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Latitude"}, "longitude": {"anyOf": [{"type": "number"}, {"type": "null"}], "title": "Longitude"}, "signed_up": {"format": "date-time", "title": "Signed Up", "type": "string"}, "contact_count": {"title": "Contact Count", "type": "integer"}, "match_count": {"title": "Match Count", "type": "integer"}}, "required": ["callsign", "name", "country", "grid_square", "latitude", "longitude", "signed_up", "contact_count", "match_count"], "title": "CallsignOut", "type": "object"}, "UploadOut": {"properties": {"id": {"title": "Id", "type": "integer"}, "callsign": {"title": "Callsign", "type": "string"}}, "required": ["id", "callsign"], "title": "UploadOut", "type": "object"}, "Input": {"properties": {"page_size": {"anyOf": [{"type": "integer"}, {"type": "null"}], "title": "Page Size"}, "cursor": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Cursor"}}, "title": "Input", "type": "object"}, "MatchOut": {"properties": {"id": {"title": "Id", "type": "integer"}, "matched_at": {"title": "Matched At", "type": "integer"}, "a_callsign": {"title": "A Callsign", "type": "string"}, "b_callsign": {"title": "B Callsign", "type": "string"}}, "required": ["id", "matched_at", "a_callsign", "b_callsign"], "title": "MatchOut", "type": "object"}, "PagedMatchOut": {"properties": {"previous": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Previous"}, "next": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Next"}, "results": {"items": {"$ref": "#/components/schemas/MatchOut"}, "title": "Results", "type": "array"}}, "required": ["previous", "next", "results"], "title": "PagedMatchOut", "type": "object"}}, "securitySchemes": {"ApiKeyAuth": {"type": "apiKey", "in": "header", "name": "X-API-Key"}}}, "servers": []}