# Retrieve a Recording GET https://YOUR_SPACE.signalwire.com/api/laml/2010-04-01/Accounts/{AccountSid}/Recordings/{Sid} Retrieve a single recording media or its metadata. This endpoint supports two different access methods with different authentication requirements: ## Public Access (No Authentication Required) Recording audio files can be accessed directly without authentication. This is useful for external applications to embed recording URLs without exposing SignalWire API credentials. SignalWire recording URLs are long and random, making them difficult to guess or exploit unless you reveal the URL. **Retrieve WAV file** When a recording URI has no extension or a `.wav` extension, the request will return a binary WAV version of the recording file. `GET https://example.signalwire.com/api/laml/2010-04-01/Accounts/{AccountSid}/Recordings/{Sid}` `GET https://example.signalwire.com/api/laml/2010-04-01/Accounts/{AccountSid}/Recordings/{Sid}.wav` **Retrieve MP3 file** Setting an extension of ".mp3" on the URI returns a binary MP3 version of the recording. For example: `GET https://example.signalwire.com/api/laml/2010-04-01/Accounts/{AccountSid}/Recordings/{Sid}.mp3` ## Authenticated Access (Voice Scope Required) **Retrieve Metadata** A recording's metadata, such as duration, cost, time, can be returned by setting the Recording URI's extension to `.json`. This requires authentication with a Voice-scoped API token. `GET https://example.signalwire.com/api/laml/2010-04-01/Accounts/{AccountSid}/Recordings/{Sid}.json` #### Permissions The API token used to authenticate must have the following scopes enabled to make a successful request: _Voice_. This permission is only required for authenticated requests to retrieve recording metadata (.json extension). [Learn more about API scopes](/docs/platform/your-signalwire-api-space). Reference: https://signalwire.com/docs/compatibility-api/rest/recordings/retrieve-recording ## OpenAPI Specification ```yaml openapi: 3.1.0 info: title: compatibility version: 1.0.0 paths: /Accounts/{AccountSid}/Recordings/{Sid}: get: operationId: retrieve-recording summary: Retrieve a Recording description: >- Retrieve a single recording media or its metadata. This endpoint supports two different access methods with different authentication requirements: ## Public Access (No Authentication Required) Recording audio files can be accessed directly without authentication. This is useful for external applications to embed recording URLs without exposing SignalWire API credentials. SignalWire recording URLs are long and random, making them difficult to guess or exploit unless you reveal the URL. **Retrieve WAV file** When a recording URI has no extension or a `.wav` extension, the request will return a binary WAV version of the recording file. `GET https://example.signalwire.com/api/laml/2010-04-01/Accounts/{AccountSid}/Recordings/{Sid}` `GET https://example.signalwire.com/api/laml/2010-04-01/Accounts/{AccountSid}/Recordings/{Sid}.wav` **Retrieve MP3 file** Setting an extension of ".mp3" on the URI returns a binary MP3 version of the recording. For example: `GET https://example.signalwire.com/api/laml/2010-04-01/Accounts/{AccountSid}/Recordings/{Sid}.mp3` ## Authenticated Access (Voice Scope Required) **Retrieve Metadata** A recording's metadata, such as duration, cost, time, can be returned by setting the Recording URI's extension to `.json`. This requires authentication with a Voice-scoped API token. `GET https://example.signalwire.com/api/laml/2010-04-01/Accounts/{AccountSid}/Recordings/{Sid}.json` #### Permissions The API token used to authenticate must have the following scopes enabled to make a successful request: _Voice_. This permission is only required for authenticated requests to retrieve recording metadata (.json extension). [Learn more about API scopes](/docs/platform/your-signalwire-api-space). tags: - subpackage_recordings parameters: - name: AccountSid in: path description: >- The unique identifier for the account that is associated with this recording. required: true schema: type: string format: uuid - name: Sid in: path description: The unique identifier for the recording. required: true schema: type: string format: uuid - name: Authorization in: header description: >- SignalWire Basic Authentication using Project ID and API Token. The client sends HTTP requests with the Authorization header containing the word Basic followed by a space and a base64-encoded string of project_id:token. The project ID will be used as the username and the API token as the password. Example: ``` Authorization: Basic base64(project_id:token) ``` required: true schema: type: string responses: '200': description: The request has succeeded. content: application/json: schema: $ref: '#/components/schemas/RecordingResponse' '400': description: >- The request was invalid or cannot be processed. Check the error details for more information. content: application/json: schema: $ref: '#/components/schemas/CompatibilityErrorResponse' '401': description: Authentication failed. Please verify your credentials and try again. content: application/json: schema: $ref: '#/components/schemas/CompatibilityErrorResponse' '404': description: >- The requested resource was not found. Please verify the resource identifier. content: application/json: schema: $ref: '#/components/schemas/CompatibilityErrorResponse' servers: - url: https://YOUR_SPACE.signalwire.com/api/laml/2010-04-01 components: schemas: RecordingResponseChannel: type: string enum: - '1' - '2' description: >- The number of channels in a recording (singular key). Returns '1' for mono or '2' for stereo. title: RecordingResponseChannel RecordingResponseChannels: type: string enum: - '1' - '2' description: >- The number of channels in a recording. Returns '1' for mono or '2' for stereo. title: RecordingResponseChannels RecordingSource: type: string enum: - DialVerb - Conference - OutBoundApi - Trunking - RecordVerb - StartCallRecordingApi - StartConferenceRecording description: Recording source. title: RecordingSource RecordingStatus: type: string enum: - queued - in-progress - paused - resumed - completed - absent - stopped description: Recording status. title: RecordingStatus RecordingSubresourceUris: type: object properties: transcriptions: type: string description: The URI for transcriptions. required: - transcriptions description: Recording subresource URIs. title: RecordingSubresourceUris RecordingResponse: type: object properties: sid: type: string format: uuid description: The unique identifier for the recording. account_sid: type: string format: uuid description: >- The unique identifier for the account that is associated with this recording. api_version: type: string description: The version of the SignalWire API. call_sid: type: - string - 'null' format: uuid description: >- The unique identifier for the call that is associated with this recording. Null if this is a conference recording. conference_sid: type: - string - 'null' format: uuid description: >- The unique identifier for the conference that is associated with this recording. Null if this is a call recording. channel: $ref: '#/components/schemas/RecordingResponseChannel' description: >- The number of channels in a recording (singular key). Returns '1' for mono or '2' for stereo. channels: $ref: '#/components/schemas/RecordingResponseChannels' description: >- The number of channels in a recording. Returns '1' for mono or '2' for stereo. date_created: type: string description: The date, in RFC 2822 format, this recording was created. date_updated: type: string description: The date, in RFC 2822 format, this recording was updated. start_time: type: - string - 'null' description: The time, in RFC 2822 format, this recording started. end_time: type: - string - 'null' description: The time, in RFC 2822 format, this recording ended. duration: type: integer description: The length, in seconds, of the recording. price: type: - string - 'null' description: The cost for the recording. price_unit: type: string description: The currency of the price of the recording. source: $ref: '#/components/schemas/RecordingSource' description: How the recording was made. status: $ref: '#/components/schemas/RecordingStatus' description: The status of the recording. error_code: type: - string - 'null' description: Further details about a failed recording. uri: type: string description: The URI of the recording. subresource_uris: $ref: '#/components/schemas/RecordingSubresourceUris' description: Subresource URIs. encryption_details: type: - string - 'null' description: Encryption details. Always null. trim: type: string description: Whether leading and trailing silence is trimmed from a recording. required: - sid - account_sid - api_version - call_sid - conference_sid - channel - channels - date_created - date_updated - start_time - end_time - duration - price - price_unit - source - status - error_code - uri - subresource_uris - encryption_details - trim description: Response containing a single recording. title: RecordingResponse CompatibilityErrorResponse: type: object properties: code: type: integer description: Error code. message: type: string description: Error message. more_info: type: string description: URL for more information about the error. status: type: integer description: HTTP status code. required: - code - message - more_info - status description: Error response model. title: CompatibilityErrorResponse securitySchemes: SignalWireBasicAuth: type: http scheme: basic description: >- SignalWire Basic Authentication using Project ID and API Token. The client sends HTTP requests with the Authorization header containing the word Basic followed by a space and a base64-encoded string of project_id:token. The project ID will be used as the username and the API token as the password. Example: ``` Authorization: Basic base64(project_id:token) ``` ``` ## SDK Code Examples ```python import requests url = "https://your_space.signalwire.com/api/laml/2010-04-01/Accounts/AccountSid/Recordings/Sid" headers = {"Authorization": "Basic :"} response = requests.get(url, headers=headers) print(response.json()) ``` ```javascript const url = 'https://your_space.signalwire.com/api/laml/2010-04-01/Accounts/AccountSid/Recordings/Sid'; const options = {method: 'GET', headers: {Authorization: 'Basic :'}}; try { const response = await fetch(url, options); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } ``` ```go package main import ( "fmt" "net/http" "io" ) func main() { url := "https://your_space.signalwire.com/api/laml/2010-04-01/Accounts/AccountSid/Recordings/Sid" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Basic :") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby require 'uri' require 'net/http' url = URI("https://your_space.signalwire.com/api/laml/2010-04-01/Accounts/AccountSid/Recordings/Sid") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Basic :' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://your_space.signalwire.com/api/laml/2010-04-01/Accounts/AccountSid/Recordings/Sid") .header("Authorization", "Basic :") .asString(); ``` ```php request('GET', 'https://your_space.signalwire.com/api/laml/2010-04-01/Accounts/AccountSid/Recordings/Sid', [ 'headers' => [ 'Authorization' => 'Basic :', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://your_space.signalwire.com/api/laml/2010-04-01/Accounts/AccountSid/Recordings/Sid"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Basic :"); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Basic :"] let request = NSMutableURLRequest(url: NSURL(string: "https://your_space.signalwire.com/api/laml/2010-04-01/Accounts/AccountSid/Recordings/Sid")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ```