FORMAT: 1A HOST: http://api.friendryde.com
This is the official documentation of the FriendRyde service to be used by the iOS and Android apps.
Beside signup resources, all others endpoints must be request with an Authorization
header. Example:
Authorization: Token 6d37107fccd2db239a2386b791b7fdf9adc17915
##Typical Server Responses
- 200
OK
- The request was successful (some API calls may return 201 instead). - 201
Created
- The request was successful and a resource was created. - 400
Bad Request
- The request could not be understood, was missing required parameters or some parameters were invalid. - 401
Unauthorized
- Authentication failed or user does not have permissions for the requested operation. - 404
Not Found
- Resource was not found. - 405
Method Not Allowed
- Requested method is not supported for the specified resource. - 500
Internal Server Error
- Some error has occured on our servers. We are usually notified when similar errors happens. Feel free to send us an email here zahim@friendryde.com
The user can either signup with his email or using his Facebook
####Regular signup
-
Parameters
- password1 (required, string) ... Password
- phone_number (required, string) ... User's phone number
- user_type (required, string) ... Possible options are :
rider
ordriver
- email (required, string, ``) ... Email field
- first_name (required, string, ``) ... User's first name
- last_name (required, string, ``) ... User's last name
- avatar (optional, image file, ``) ... The user's picture.
-
Request
-
Response 201 (application/json)
{ "user_type": "rider", "token": "4f3b86bcbebd5ab048ef42c93f3985d9753a008a", "id": 76 }
-
Response 400
{ "phone_number": [ "This field is required." ], "password1": [ "This field is required." ], "first_name": [ "This field is required." ], "last_name": [ "This field is required." ], "user_type": [ "This field is required." ], "email": [ "A user with that username already exists." ] }
This endpoint must be used for both signup and login with Facebook access token. If some error is generated by Facebook, we return it using as a response with 400 status code.
-
Parameters
- access_token (required, string) ... Facebook's access token. Facebook authorization must be done by iOS or Android app
- user_type (required, string) ... Possible options are :
rider
ordriver
-
Request
{ "access_token": "CAAFITQPVWrYBANYRyjL5Fqy2WxUZCGTb9SFtbIK0xWB42EWNqjB4JNq7zdwoQGZCN4ak1r5m6LcDZBeZArbyPJdwQLhRlVnLnrijSJuj12vcnZCbsL5gYWUT7lEaLkIZAFSC4C9TuLx2G0MuMh9qZAaIlZAghPOvli8TRXqNwyeF3HZCqMB6bJT2sFryNgG5qli0ZD", "user_type": "rider" }
-
Response 201 (application/json)
{ "user_type": "rider", "token": "4f3b86bcbebd5ab048ef42ceef3985d9753a008a", "id": 56 }
-
Response 400
{ "detail": { "code": 2, "message": "An unexpected error has occurred. Please retry your request later.", "is_transient": true, "type": "OAuthException" } }
Check the credentials and return the REST Token if the credentials are valid and authenticated. Accept the following POST parameters: username, password.
-
Parameters
- username (required, string) ... Username
- password (required, string) ... Password
-
Request (application/json)
{"username": "john.doe", "password": "my_password"}
-
Response 200
{ "key": "8714b9ebffc4170e11092984d323f619fe2cf720" }
-
Response 401
{ "error": "Invalid Username/Password." }
Use this resource to get the authenticated user's information.
| Field | Description | Editable
|---|---|---|---|---|
|url |User's absolute URL | No |
|reviews_url |URL to the resource providing reviews about the user |No |
|driverprofile |The driver profile resource url. Only available if the user_type
is driver. | No |
|car |The user's car resource url. Only available if the user_type
is driver | No |
|id |User id | No |
|user_type |Possible options are driver
& rider
| No |
|truncated_name |The user's first name + first letter of his last name. Used to display drivers names to travelers | No |
|full_name |The user's full name| No |
|rating |score
is the user's rating for count
rating he received | No |
|first_name |The user's first name|Yes |
|last_name |The user's last name|Yes |
|email |User's email | Yes |
|city |The user's city |Yes |
|country |two-letter country codes following the ISO 3166-1 alpha-2 standard|Yes |
|phone_number |The user's phone number |Yes |
|languages |An array of the languages spoken by the user |No |
|avatar |Avatar of the user |Yes |
|wiretransfer |The user's wire transfer resource URL |No |
-
Request
-
Headers
Accept: application/json Authorization: Token {user-token}
-
-
Response 200 (application/json)
{ "url": "https://api.friendryde.com/v1/user/52/", "avatar": "http://www.friendryde.com/media/avatar/52.jpg", "id": 52, "email": "john.doe@gmail.com", "city": "Rabat, Morocco", "country": "MA", "full_name": "John Doe", "driverprofile": "http://api.friendryde.com/v1/driver/15/", "phone_number": "+212600112233", "first_name": "John", "last_name": "Doe", "car": "https://api.friendryde.com/v1/car/14/", "truncated_name": "John d.", "user_type": "driver", "rating": { "count": 0, "score": null }, "reviews_url": "http://api.friendryde.com/v1/user/52/reviews/", "languages": [ "English", "Arabic", "Moroccan Arabic", "Berber", "French" ], "wiretransfer": "http://localhost.com:8000/api/v1/withdrawal/wiretransfer/5/" }
Use this resource to update the user's information.
-
Parameters
- avatar (optional, image file, ``) ... The user's picture.
- phone_number (required, string) ... User's phone number
- email (required, string, ``) ... Email field
- first_name (required, string, ``) ... User's first name
- last_name (required, string, ``) ... User's last name
- city (required, string, ``) ... User's city
- country (optional, string,
US
) ... two-letter country codes following the ISO 3166-1 alpha-2 standard
-
Request
-
Headers
Authorization: Token {user-token}
-
-
Response 200 (application/json)
{ "url": "https://api.friendryde.com/v1/user/52/", "avatar": "http://www.friendryde.com/media/avatar/52.jpg", "id": 52, "email": "john.doe@gmail.com", "city": "Rabat, Morocco", "country": "MA", "full_name": "John Doe", "driverprofile": "http://api.friendryde.com/v1/driver/15/", "phone_number": "+21260000000", "first_name": "John", "last_name": "Doe", "car": "https://api.friendryde.com/v1/car/14/", "truncated_name": "John d.", "user_type": "driver", "rating": { "count": 0, "score": null }, "reviews_url": "http://api.friendryde.com/v1/user/52/reviews/", "languages": [ "English", "Arabic", "Moroccan Arabic", "Berber", "French" ] }
-
Response 400
{ "email": [ "Enter a valid email address." ] }
-
Request
-
Headers
Authorization: Token {user-token}
-
-
Response 200
{ "name": "User instance", "description": "", "renders": [ "application/json", "text/html" ], "parses": [ "application/json", "application/x-www-form-urlencoded", "multipart/form-data" ], "actions": { "PATCH": { "url": { "type": "field", "required": false, "read_only": true }, "avatar": { "type": "image upload", "required": true, "read_only": false }, "id": { "type": "integer", "required": false, "read_only": true, "label": "ID" }, "email": { "type": "email", "required": false, "read_only": false, "label": "email address", "max_length": 75 }, "city": { "type": "string", "required": true, "read_only": false, "label": "city", "max_length": 255 }, "country": { "type": "choice", "required": false, "read_only": false, "label": "country", "choices": [ { "display_name": "---------", "value": "" }, { "display_name": "Afghanistan", "value": "AF" }, { "display_name": "Albania", "value": "AL" }, { "display_name": "Algeria", "value": "DZ" }, { "display_name": "American Samoa", "value": "AS" }, { "display_name": "Andorra", "value": "AD" }, { "display_name": "Angola", "value": "AO" }, { "display_name": "Anguilla", "value": "AI" }, { "display_name": "Antarctica", "value": "AQ" }, { "display_name": "Antigua and Barbuda", "value": "AG" }, { "display_name": "Argentina", "value": "AR" }, { "display_name": "Armenia", "value": "AM" }, { "display_name": "Aruba", "value": "AW" }, { "display_name": "Australia", "value": "AU" }, { "display_name": "Austria", "value": "AT" }, { "display_name": "Azerbaijan", "value": "AZ" }, { "display_name": "Bahamas", "value": "BS" }, { "display_name": "Bahrain", "value": "BH" }, { "display_name": "Bangladesh", "value": "BD" }, { "display_name": "Barbados", "value": "BB" }, { "display_name": "Belarus", "value": "BY" }, { "display_name": "Belgium", "value": "BE" }, { "display_name": "Belize", "value": "BZ" }, { "display_name": "Benin", "value": "BJ" }, { "display_name": "Bermuda", "value": "BM" }, { "display_name": "Bhutan", "value": "BT" }, { "display_name": "Bolivia, Plurinational State of", "value": "BO" }, { "display_name": "Bonaire, Sint Eustatius and Saba", "value": "BQ" }, { "display_name": "Bosnia and Herzegovina", "value": "BA" }, { "display_name": "Botswana", "value": "BW" }, { "display_name": "Bouvet Island", "value": "BV" }, { "display_name": "Brazil", "value": "BR" }, { "display_name": "British Indian Ocean Territory", "value": "IO" }, { "display_name": "Brunei Darussalam", "value": "BN" }, { "display_name": "Bulgaria", "value": "BG" }, { "display_name": "Burkina Faso", "value": "BF" }, { "display_name": "Burundi", "value": "BI" }, { "display_name": "Cambodia", "value": "KH" }, { "display_name": "Cameroon", "value": "CM" }, { "display_name": "Canada", "value": "CA" }, { "display_name": "Cape Verde", "value": "CV" }, { "display_name": "Cayman Islands", "value": "KY" }, { "display_name": "Central African Republic", "value": "CF" }, { "display_name": "Chad", "value": "TD" }, { "display_name": "Chile", "value": "CL" }, { "display_name": "China", "value": "CN" }, { "display_name": "Christmas Island", "value": "CX" }, { "display_name": "Cocos (Keeling) Islands", "value": "CC" }, { "display_name": "Colombia", "value": "CO" }, { "display_name": "Comoros", "value": "KM" }, { "display_name": "Congo", "value": "CG" }, { "display_name": "Congo (the Democratic Republic of the)", "value": "CD" }, { "display_name": "Cook Islands", "value": "CK" }, { "display_name": "Costa Rica", "value": "CR" }, { "display_name": "Croatia", "value": "HR" }, { "display_name": "Cuba", "value": "CU" }, { "display_name": "Curaçao", "value": "CW" }, { "display_name": "Cyprus", "value": "CY" }, { "display_name": "Czech Republic", "value": "CZ" }, { "display_name": "Côte d'Ivoire", "value": "CI" }, { "display_name": "Denmark", "value": "DK" }, { "display_name": "Djibouti", "value": "DJ" }, { "display_name": "Dominica", "value": "DM" }, { "display_name": "Dominican Republic", "value": "DO" }, { "display_name": "Ecuador", "value": "EC" }, { "display_name": "Egypt", "value": "EG" }, { "display_name": "El Salvador", "value": "SV" }, { "display_name": "Equatorial Guinea", "value": "GQ" }, { "display_name": "Eritrea", "value": "ER" }, { "display_name": "Estonia", "value": "EE" }, { "display_name": "Ethiopia", "value": "ET" }, { "display_name": "Falkland Islands [Malvinas]", "value": "FK" }, { "display_name": "Faroe Islands", "value": "FO" }, { "display_name": "Fiji", "value": "FJ" }, { "display_name": "Finland", "value": "FI" }, { "display_name": "France", "value": "FR" }, { "display_name": "French Guiana", "value": "GF" }, { "display_name": "French Polynesia", "value": "PF" }, { "display_name": "French Southern Territories", "value": "TF" }, { "display_name": "Gabon", "value": "GA" }, { "display_name": "Gambia (The)", "value": "GM" }, { "display_name": "Georgia", "value": "GE" }, { "display_name": "Germany", "value": "DE" }, { "display_name": "Ghana", "value": "GH" }, { "display_name": "Gibraltar", "value": "GI" }, { "display_name": "Greece", "value": "GR" }, { "display_name": "Greenland", "value": "GL" }, { "display_name": "Grenada", "value": "GD" }, { "display_name": "Guadeloupe", "value": "GP" }, { "display_name": "Guam", "value": "GU" }, { "display_name": "Guatemala", "value": "GT" }, { "display_name": "Guernsey", "value": "GG" }, { "display_name": "Guinea", "value": "GN" }, { "display_name": "Guinea-Bissau", "value": "GW" }, { "display_name": "Guyana", "value": "GY" }, { "display_name": "Haiti", "value": "HT" }, { "display_name": "Heard Island and McDonald Islands", "value": "HM" }, { "display_name": "Holy See [Vatican City State]", "value": "VA" }, { "display_name": "Honduras", "value": "HN" }, { "display_name": "Hong Kong", "value": "HK" }, { "display_name": "Hungary", "value": "HU" }, { "display_name": "Iceland", "value": "IS" }, { "display_name": "India", "value": "IN" }, { "display_name": "Indonesia", "value": "ID" }, { "display_name": "Iran (the Islamic Republic of)", "value": "IR" }, { "display_name": "Iraq", "value": "IQ" }, { "display_name": "Ireland", "value": "IE" }, { "display_name": "Isle of Man", "value": "IM" }, { "display_name": "Israel", "value": "IL" }, { "display_name": "Italy", "value": "IT" }, { "display_name": "Jamaica", "value": "JM" }, { "display_name": "Japan", "value": "JP" }, { "display_name": "Jersey", "value": "JE" }, { "display_name": "Jordan", "value": "JO" }, { "display_name": "Kazakhstan", "value": "KZ" }, { "display_name": "Kenya", "value": "KE" }, { "display_name": "Kiribati", "value": "KI" }, { "display_name": "Korea (the Democratic People's Republic of)", "value": "KP" }, { "display_name": "Korea (the Republic of)", "value": "KR" }, { "display_name": "Kuwait", "value": "KW" }, { "display_name": "Kyrgyzstan", "value": "KG" }, { "display_name": "Lao People's Democratic Republic", "value": "LA" }, { "display_name": "Latvia", "value": "LV" }, { "display_name": "Lebanon", "value": "LB" }, { "display_name": "Lesotho", "value": "LS" }, { "display_name": "Liberia", "value": "LR" }, { "display_name": "Libya", "value": "LY" }, { "display_name": "Liechtenstein", "value": "LI" }, { "display_name": "Lithuania", "value": "LT" }, { "display_name": "Luxembourg", "value": "LU" }, { "display_name": "Macao", "value": "MO" }, { "display_name": "Macedonia (the former Yugoslav Republic of)", "value": "MK" }, { "display_name": "Madagascar", "value": "MG" }, { "display_name": "Malawi", "value": "MW" }, { "display_name": "Malaysia", "value": "MY" }, { "display_name": "Maldives", "value": "MV" }, { "display_name": "Mali", "value": "ML" }, { "display_name": "Malta", "value": "MT" }, { "display_name": "Marshall Islands", "value": "MH" }, { "display_name": "Martinique", "value": "MQ" }, { "display_name": "Mauritania", "value": "MR" }, { "display_name": "Mauritius", "value": "MU" }, { "display_name": "Mayotte", "value": "YT" }, { "display_name": "Mexico", "value": "MX" }, { "display_name": "Micronesia (the Federated States of)", "value": "FM" }, { "display_name": "Moldova (the Republic of)", "value": "MD" }, { "display_name": "Monaco", "value": "MC" }, { "display_name": "Mongolia", "value": "MN" }, { "display_name": "Montenegro", "value": "ME" }, { "display_name": "Montserrat", "value": "MS" }, { "display_name": "Morocco", "value": "MA" }, { "display_name": "Mozambique", "value": "MZ" }, { "display_name": "Myanmar", "value": "MM" }, { "display_name": "Namibia", "value": "NA" }, { "display_name": "Nauru", "value": "NR" }, { "display_name": "Nepal", "value": "NP" }, { "display_name": "Netherlands", "value": "NL" }, { "display_name": "New Caledonia", "value": "NC" }, { "display_name": "New Zealand", "value": "NZ" }, { "display_name": "Nicaragua", "value": "NI" }, { "display_name": "Niger", "value": "NE" }, { "display_name": "Nigeria", "value": "NG" }, { "display_name": "Niue", "value": "NU" }, { "display_name": "Norfolk Island", "value": "NF" }, { "display_name": "Northern Mariana Islands", "value": "MP" }, { "display_name": "Norway", "value": "NO" }, { "display_name": "Oman", "value": "OM" }, { "display_name": "Pakistan", "value": "PK" }, { "display_name": "Palau", "value": "PW" }, { "display_name": "Palestine, State of", "value": "PS" }, { "display_name": "Panama", "value": "PA" }, { "display_name": "Papua New Guinea", "value": "PG" }, { "display_name": "Paraguay", "value": "PY" }, { "display_name": "Peru", "value": "PE" }, { "display_name": "Philippines", "value": "PH" }, { "display_name": "Pitcairn", "value": "PN" }, { "display_name": "Poland", "value": "PL" }, { "display_name": "Portugal", "value": "PT" }, { "display_name": "Puerto Rico", "value": "PR" }, { "display_name": "Qatar", "value": "QA" }, { "display_name": "Romania", "value": "RO" }, { "display_name": "Russian Federation", "value": "RU" }, { "display_name": "Rwanda", "value": "RW" }, { "display_name": "Réunion", "value": "RE" }, { "display_name": "Saint Barthélemy", "value": "BL" }, { "display_name": "Saint Helena, Ascension and Tristan da Cunha", "value": "SH" }, { "display_name": "Saint Kitts and Nevis", "value": "KN" }, { "display_name": "Saint Lucia", "value": "LC" }, { "display_name": "Saint Martin (French part)", "value": "MF" }, { "display_name": "Saint Pierre and Miquelon", "value": "PM" }, { "display_name": "Saint Vincent and the Grenadines", "value": "VC" }, { "display_name": "Samoa", "value": "WS" }, { "display_name": "San Marino", "value": "SM" }, { "display_name": "Sao Tome and Principe", "value": "ST" }, { "display_name": "Saudi Arabia", "value": "SA" }, { "display_name": "Senegal", "value": "SN" }, { "display_name": "Serbia", "value": "RS" }, { "display_name": "Seychelles", "value": "SC" }, { "display_name": "Sierra Leone", "value": "SL" }, { "display_name": "Singapore", "value": "SG" }, { "display_name": "Sint Maarten (Dutch part)", "value": "SX" }, { "display_name": "Slovakia", "value": "SK" }, { "display_name": "Slovenia", "value": "SI" }, { "display_name": "Solomon Islands", "value": "SB" }, { "display_name": "Somalia", "value": "SO" }, { "display_name": "South Africa", "value": "ZA" }, { "display_name": "South Georgia and the South Sandwich Islands", "value": "GS" }, { "display_name": "South Sudan", "value": "SS" }, { "display_name": "Spain", "value": "ES" }, { "display_name": "Sri Lanka", "value": "LK" }, { "display_name": "Sudan", "value": "SD" }, { "display_name": "Suriname", "value": "SR" }, { "display_name": "Svalbard and Jan Mayen", "value": "SJ" }, { "display_name": "Swaziland", "value": "SZ" }, { "display_name": "Sweden", "value": "SE" }, { "display_name": "Switzerland", "value": "CH" }, { "display_name": "Syrian Arab Republic", "value": "SY" }, { "display_name": "Taiwan (Province of China)", "value": "TW" }, { "display_name": "Tajikistan", "value": "TJ" }, { "display_name": "Tanzania, United Republic of", "value": "TZ" }, { "display_name": "Thailand", "value": "TH" }, { "display_name": "Timor-Leste", "value": "TL" }, { "display_name": "Togo", "value": "TG" }, { "display_name": "Tokelau", "value": "TK" }, { "display_name": "Tonga", "value": "TO" }, { "display_name": "Trinidad and Tobago", "value": "TT" }, { "display_name": "Tunisia", "value": "TN" }, { "display_name": "Turkey", "value": "TR" }, { "display_name": "Turkmenistan", "value": "TM" }, { "display_name": "Turks and Caicos Islands", "value": "TC" }, { "display_name": "Tuvalu", "value": "TV" }, { "display_name": "Uganda", "value": "UG" }, { "display_name": "Ukraine", "value": "UA" }, { "display_name": "United Arab Emirates", "value": "AE" }, { "display_name": "United Kingdom", "value": "GB" }, { "display_name": "United States", "value": "US" }, { "display_name": "United States Minor Outlying Islands", "value": "UM" }, { "display_name": "Uruguay", "value": "UY" }, { "display_name": "Uzbekistan", "value": "UZ" }, { "display_name": "Vanuatu", "value": "VU" }, { "display_name": "Venezuela, Bolivarian Republic of", "value": "VE" }, { "display_name": "Viet Nam", "value": "VN" }, { "display_name": "Virgin Islands (British)", "value": "VG" }, { "display_name": "Virgin Islands (U.S.)", "value": "VI" }, { "display_name": "Wallis and Futuna", "value": "WF" }, { "display_name": "Western Sahara", "value": "EH" }, { "display_name": "Yemen", "value": "YE" }, { "display_name": "Zambia", "value": "ZM" }, { "display_name": "Zimbabwe", "value": "ZW" }, { "display_name": "Åland Islands", "value": "AX" } ] }, "full_name": { "type": "field", "required": false, "read_only": true }, "driverprofile": { "type": "field", "required": true, "read_only": false }, "phone_number": { "type": "string", "required": true, "read_only": false, "label": "phone number", "max_length": 100 }, "first_name": { "type": "string", "required": false, "read_only": false, "label": "first name", "max_length": 30 }, "last_name": { "type": "string", "required": false, "read_only": false, "label": "last name", "max_length": 30 }, "car": { "type": "field", "required": true, "read_only": true }, "truncated_name": { "type": "field", "required": false, "read_only": true }, "user_type": { "type": "choice", "required": true, "read_only": true, "label": "user type", "choices": [ { "display_name": "Traveler", "value": "rider" }, { "display_name": "Driver", "value": "driver" }, { "display_name": "Partner", "value": "partner" } ] }, "rating": { "type": "field", "required": false, "read_only": true }, "reviews_url": { "type": "field", "required": false, "read_only": true }, "languages": { "type": "field", "required": false, "read_only": true }, "units_of_measurement": { "type": "choice", "required": true, "read_only": false, "label": "units of measurement", "choices": [ { "display_name": "imperial", "value": "imperial" }, { "display_name": "metric", "value": "metric" } ] } } } }
Use this endpoint to set a password for the user when he signs up using Facebook
Fields:
- new_password1
- new_password2
-
Request (application/json)
+ Headers Authorization: Token {user-token}
-
Body
{"new_password1": "my_password", "new_password2": "my_password"}
-
-
Response 200
{'detail': 'password set'}
-
Response 400
{ "detail": { "__all__": [ "You can set a password only for new accounts" ] } }
Use this endpoint to change a user's password
Fields:
- new_password1
- new_password2
-
Request (application/json)
+ Headers Authorization: Token {user-token}
-
Body
{"new_password1": "my_password", "new_password2": "my_password"}
-
-
Response 200
{"success": "New password has been saved."}
-
Response 400
{ new_password2: [ "The two password fields didn't match." ] }
Used for tracking the user's position.
Adds a user's position.
-
Request (application/json)
+ Headers Authorization: Token {user-token}
-
Body
{"lat": 15.15, "lng":36.36}
-
-
Response 201
{ "position": { "type": "Point", "coordinates": [ 15.15, 36.36 ] }, "last_seen": "2014-09-11T17:20:56.254" }
-
Response 400
{ "detail": { "lat": [ "Enter a number." ] } }
Returns the user's last position in GeoJSON format
-
Request
-
Headers
Authorization: Token {user-token}
-
-
Response 200
{ "position": { "type": "Point", "coordinates": [ 37, 56 ] }, "last_seen": "2014-09-11T17:20:56.254" }
Use this endpoint to get reviews about a user.
-
Parameters
- id (required, string,
34
) ... The user's id
- id (required, string,
-
Request (application/json)
-
Headers
Authorization: Token {user-token}
-
-
Response 200
[ { "comment": "Great driver !", "id": 15, "score": 5, "creation_date": "2014-09-27T01:20:57.294Z" }, { "comment": "", "id": 11, "score": 3, "creation_date": "2014-09-11T17:55:11.555Z" } ]
Stores Android registration ID on the server side for the authentication user. Returns a list of the registration IDs for the same user.
-
Request (application/json)
-
Headers
Authorization: Token {user-token}
-
Body
{"registration_id": "5245rc9e56g648f6dd"}
-
-
Response 200
[ "5245rc9e56g648f6dd" ]
-
Response 400
{ "detail": { "registration_id": [ "This field is required." ] } }
Use this resource to convert a traveler's account to driver account.
-
Request (application/json)
-
Headers
Authorization: Token {user-token}
-
-
Response 200
{ "url": "https://api.friendryde.com/v1/user/52/", "avatar": "http://www.friendryde.com/media/avatar/52.jpg", "id": 52, "email": "john.doe@gmail.com", "city": "Rabat, Morocco", "country": "MA", "full_name": "John Doe", "driverprofile": "http://api.friendryde.com/v1/driver/15/", "phone_number": "+21260000000", "first_name": "John", "last_name": "Doe", "car": "https://api.friendryde.com/v1/car/14/", "truncated_name": "John D.", "user_type": "driver", "rating": { "count": 3, "score": 4 }, "reviews_url": "http://api.friendryde.com/v1/user/52/reviews/", "languages": [ "English", "Arabic", "Moroccan Arabic", "Berber", "French", ] }
-
Request (application/json)
-
Headers
Authorization: Token {user-token}
-
-
Response 200
{"confirmed": [], "pending": [], "history": []}
Use this resource to get the car's information.
| Field | Description | Editable |---|---|---|---|---| |url |Car's absolute URL | No | |user |Car owner | No | |car_make_display |Car make to display to the user|No | |luggage_display |Number of luggage the car can hold. To display to the user|No | |image |Image of the car |Yes | |car_make |Car make |Yes | |car_model |Car model|Yes | |seats |Number of seats |Yes | |doors |Number of doors |Yes | |car_type |Car type |Yes | |has_ac |Car has air conditionner|Yes | |wheelchair |Car has wheelchair capability|Yes | |luggage |Number of luggage the car can hold|Yes |
-
Parameters
- id (required, number,
55
) ... The car id
- id (required, number,
-
Request
-
Headers
Accept: application/json Authorization: Token {user-token}
-
-
Response 200 (application/json)
{ "image": "https://www.friendryde.com/media/users/car/Audi-A1.jpg", "car_make_display": "Volvo", "seats_display": "4 passengers", "luggage_display": "1 luggage", "url": "https://api.friendryde.com/v1/car/10/", "user": "https://api.friendryde.com/v1/user/34/", "car_make": "volvo", "car_model": "A1", "seats": 4, "doors": null, "car_type": "Economy", "has_ac": true, "wheelchair": true, "luggage": 1, "year": 2012 }
Use this resource to update the car's information.
-
Parameters
- image (optional, image file, ``) ... Image of the car.
- car_make (required, string,
volvo
) ... Car make - car_model (required, string,
S80
) ... Car model - seats (required, integer, ``) ... Number of seats of the car
- doors (required, integer, ``) ... Number of doors
- luggage (required, integer, ``) ... Number of luggage the car can hold
- car_type (required, string,
Economy
) ... Car type. Possible options are :Economy
,Standard
,SUV
,Luxury
orMinivan
. Values are case sensitive - has_ac (optional, bool,
true
) ... Indicates if the car has air condtionner - wheelchair (optional, bool,
true
) ... Indicates if the car is disabled friendly - year (optional, integer,
2010
) ... The year the car was made
-
Request
-
Headers
Authorization: Token {user-token}
-
Body
{"seats": 5}
-
-
Response 200 (application/json)
{ "image": "https://www.friendryde.com/media/users/car/Audi-A1.jpg", "car_make_display": "Volvo", "seats_display": "5 passengers", "luggage_display": "1 luggage", "url": "https://api.friendryde.com/v1/car/10/", "user": "https://api.friendryde.com/v1/user/34/", "car_make": "volvo", "car_model": "A1", "seats": 5, "doors": null, "car_type": "Economy", "has_ac": true, "wheelchair": true, "luggage": 1, "year": 2012 }
-
Response 400
{ "car_type": [ "Select a valid choice. bike is not one of the available choices." ] }
OPTIONS
is also valid for /v1/car/
when needed.
-
Parameters
- id (optional, integer,
1
) ... Car id.
- id (optional, integer,
-
Request
-
Headers
Authorization: Token {user-token}
-
-
Response 200 (application/json)
{ "name": "Car List", "description": "", "renders": [ "application/json", "text/html" ], "parses": [ "application/json", "application/x-www-form-urlencoded", "multipart/form-data" ], "actions": { "POST": { "image": { "type": "image upload", "required": true, "read_only": false }, "car_make_display": { "type": "string", "required": false, "read_only": true }, "seats_display": { "type": "string", "required": false, "read_only": true }, "luggage_display": { "type": "string", "required": false, "read_only": true }, "url": { "type": "field", "required": false, "read_only": true }, "user": { "type": "field", "required": true, "read_only": true, "label": "user" }, "car_make": { "type": "choice", "required": true, "read_only": false, "label": "What's your car make?", "choices": [ { "display_name": "Abarth", "value": "abarth" }, { "display_name": "AC", "value": "ac" }, { "display_name": "Acura", "value": "acura" }, { "display_name": "Alfa Romeo", "value": "alfa-romeo" }, { "display_name": "Allard", "value": "allard" }, { "display_name": "Alpina", "value": "alpina" }, { "display_name": "Alpine", "value": "alpine" }, { "display_name": "Alvis", "value": "alvis" }, { "display_name": "AMC", "value": "amc" }, { "display_name": "Ariel", "value": "ariel" }, { "display_name": "Armstrong Siddeley", "value": "armstrong-siddeley" }, { "display_name": "Ascari", "value": "ascari" }, { "display_name": "Aston Martin", "value": "aston-martin" }, { "display_name": "Audi", "value": "audi" }, { "display_name": "Austin", "value": "austin" }, { "display_name": "Austin-Healey", "value": "austin-healey" }, { "display_name": "Autobianchi", "value": "autobianchi" }, { "display_name": "Auverland", "value": "auverland" }, { "display_name": "Avanti", "value": "avanti" }, { "display_name": "Beijing", "value": "beijing" }, { "display_name": "Bentley", "value": "bentley" }, { "display_name": "Berkeley", "value": "berkeley" }, { "display_name": "Bitter", "value": "bitter" }, { "display_name": "Bizzarrini", "value": "bizzarrini" }, { "display_name": "BMW", "value": "bmw" }, { "display_name": "Brilliance", "value": "brilliance" }, { "display_name": "Bristol", "value": "bristol" }, { "display_name": "Bugatti", "value": "bugatti" }, { "display_name": "Buick", "value": "buick" }, { "display_name": "Cadillac", "value": "cadillac" }, { "display_name": "Caterham", "value": "caterham" }, { "display_name": "Checker", "value": "checker" }, { "display_name": "Chevrolet", "value": "chevrolet" }, { "display_name": "Chrysler", "value": "chrysler" }, { "display_name": "Citroen", "value": "citroen" }, { "display_name": "Dacia", "value": "dacia" }, { "display_name": "Daewoo", "value": "daewoo" }, { "display_name": "DAF", "value": "daf" }, { "display_name": "Daihatsu", "value": "daihatsu" }, { "display_name": "Daimler", "value": "daimler" }, { "display_name": "Datsun", "value": "datsun" }, { "display_name": "De Tomaso", "value": "de-tomaso" }, { "display_name": "DKW", "value": "dkw" }, { "display_name": "Dodge", "value": "dodge" }, { "display_name": "Donkervoort", "value": "donkervoort" }, { "display_name": "Eagle", "value": "eagle" }, { "display_name": "Fairthorpe", "value": "fairthorpe" }, { "display_name": "Ferrari", "value": "ferrari" }, { "display_name": "Fiat", "value": "fiat" }, { "display_name": "Fisker", "value": "fisker" }, { "display_name": "Ford", "value": "ford" }, { "display_name": "GAZ", "value": "gaz" }, { "display_name": "Geely", "value": "geely" }, { "display_name": "Ginetta", "value": "ginetta" }, { "display_name": "GMC", "value": "gmc" }, { "display_name": "Holden", "value": "holden" }, { "display_name": "Honda", "value": "honda" }, { "display_name": "Hudson", "value": "hudson" }, { "display_name": "Humber", "value": "humber" }, { "display_name": "Hummer", "value": "hummer" }, { "display_name": "Hyundai", "value": "hyundai" }, { "display_name": "Infiniti", "value": "infiniti" }, { "display_name": "Innocenti", "value": "innocenti" }, { "display_name": "Isuzu", "value": "isuzu" }, { "display_name": "Italdesign", "value": "italdesign" }, { "display_name": "JAC", "value": "jac" }, { "display_name": "Jaguar", "value": "jaguar" }, { "display_name": "Jeep", "value": "jeep" }, { "display_name": "Jensen", "value": "jensen" }, { "display_name": "Kia", "value": "kia" }, { "display_name": "Koenigsegg", "value": "koenigsegg" }, { "display_name": "Lada", "value": "lada" }, { "display_name": "Lamborghini", "value": "lamborghini" }, { "display_name": "Lancia", "value": "lancia" }, { "display_name": "Land Rover", "value": "land-rover" }, { "display_name": "Lexus", "value": "lexus" }, { "display_name": "Lincoln", "value": "lincoln" }, { "display_name": "Lotec", "value": "lotec" }, { "display_name": "Lotus", "value": "lotus" }, { "display_name": "Luxgen", "value": "luxgen" }, { "display_name": "Mahindra", "value": "mahindra" }, { "display_name": "Marcos", "value": "marcos" }, { "display_name": "Maserati", "value": "maserati" }, { "display_name": "Matra-Simca", "value": "matra-simca" }, { "display_name": "Maybach", "value": "maybach" }, { "display_name": "Mazda", "value": "mazda" }, { "display_name": "MCC", "value": "mcc" }, { "display_name": "McLaren", "value": "mclaren" }, { "display_name": "Mercedes-Benz", "value": "mercedes-benz" }, { "display_name": "Mercury", "value": "mercury" }, { "display_name": "MG", "value": "mg" }, { "display_name": "Mini", "value": "mini" }, { "display_name": "Mitsubishi", "value": "mitsubishi" }, { "display_name": "Monteverdi", "value": "monteverdi" }, { "display_name": "Moretti", "value": "moretti" }, { "display_name": "Morgan", "value": "morgan" }, { "display_name": "Morris", "value": "morris" }, { "display_name": "Nissan", "value": "nissan" }, { "display_name": "Noble", "value": "noble" }, { "display_name": "NSU", "value": "nsu" }, { "display_name": "Oldsmobile", "value": "oldsmobile" }, { "display_name": "Opel", "value": "opel" }, { "display_name": "Packard", "value": "packard" }, { "display_name": "Pagani", "value": "pagani" }, { "display_name": "Panoz", "value": "panoz" }, { "display_name": "Peugeot", "value": "peugeot" }, { "display_name": "Pininfarina", "value": "pininfarina" }, { "display_name": "Plymouth", "value": "plymouth" }, { "display_name": "Pontiac", "value": "pontiac" }, { "display_name": "Porsche", "value": "porsche" }, { "display_name": "Proton", "value": "proton" }, { "display_name": "Reliant", "value": "reliant" }, { "display_name": "Renault", "value": "renault" }, { "display_name": "Riley", "value": "riley" }, { "display_name": "Rolls-Royce", "value": "rolls-royce" }, { "display_name": "Rover", "value": "rover" }, { "display_name": "Saab", "value": "saab" }, { "display_name": "Saleen", "value": "saleen" }, { "display_name": "Samsung", "value": "samsung" }, { "display_name": "Saturn", "value": "saturn" }, { "display_name": "Scion", "value": "scion" }, { "display_name": "Seat", "value": "seat" }, { "display_name": "Simca", "value": "simca" }, { "display_name": "Singer", "value": "singer" }, { "display_name": "Skoda", "value": "skoda" }, { "display_name": "Smart", "value": "smart" }, { "display_name": "Spyker", "value": "spyker" }, { "display_name": "SsangYong", "value": "ssangyong" }, { "display_name": "SSC", "value": "ssc" }, { "display_name": "Steyr", "value": "steyr" }, { "display_name": "Studebaker", "value": "studebaker" }, { "display_name": "Subaru", "value": "subaru" }, { "display_name": "Sunbeam", "value": "sunbeam" }, { "display_name": "Suzuki", "value": "suzuki" }, { "display_name": "Talbot", "value": "talbot" }, { "display_name": "Tata", "value": "tata" }, { "display_name": "Tatra", "value": "tatra" }, { "display_name": "Tesla", "value": "tesla" }, { "display_name": "Toyota", "value": "toyota" }, { "display_name": "Trabant", "value": "trabant" }, { "display_name": "Triumph", "value": "triumph" }, { "display_name": "TVR", "value": "tvr" }, { "display_name": "Vauxhall", "value": "vauxhall" }, { "display_name": "Vector", "value": "vector" }, { "display_name": "Venturi", "value": "venturi" }, { "display_name": "Volkswagen", "value": "volkswagen" }, { "display_name": "Volvo", "value": "volvo" }, { "display_name": "Wartburg", "value": "wartburg" }, { "display_name": "Westfield", "value": "westfield" }, { "display_name": "Willys-Overland", "value": "willys-overland" }, { "display_name": "Xedos", "value": "xedos" }, { "display_name": "Zagato", "value": "zagato" }, { "display_name": "Zastava", "value": "zastava" }, { "display_name": "ZAZ", "value": "zaz" }, { "display_name": "Zenvo", "value": "zenvo" }, { "display_name": "ZIL", "value": "zil" } ] }, "car_model": { "type": "string", "required": true, "read_only": false, "label": "What's your car model", "max_length": 50 }, "seats": { "type": "choice", "required": true, "read_only": false, "label": "Number of passengers", "choices": [ { "display_name": "1 passenger", "value": 1 }, { "display_name": "2 passengers", "value": 2 }, { "display_name": "3 passengers", "value": 3 }, { "display_name": "4 passengers", "value": 4 }, { "display_name": "5 passengers", "value": 5 }, { "display_name": "6 passengers", "value": 6 } ] }, "doors": { "type": "choice", "required": false, "read_only": false, "label": "doors", "choices": [ { "display_name": "---------", "value": "" }, { "display_name": "2 doors", "value": 2 }, { "display_name": "4 doors", "value": 4 } ] }, "car_type": { "type": "choice", "required": true, "read_only": false, "label": "What's your car type?", "choices": [ { "display_name": "Economy", "value": "Economy" }, { "display_name": "Standard", "value": "Standard" }, { "display_name": "SUV (4x4)", "value": "SUV" }, { "display_name": "Minivan", "value": "Minivan" }, { "display_name": "Luxury", "value": "Luxury" } ] }, "has_ac": { "type": "boolean", "required": false, "read_only": false, "label": "has ac" }, "wheelchair": { "type": "boolean", "required": false, "read_only": false, "label": "Disabled friendly" }, "luggage": { "type": "choice", "required": true, "read_only": false, "label": "luggage", "choices": [ { "display_name": "1 luggage", "value": 1 }, { "display_name": "2 luggages", "value": 2 }, { "display_name": "3 luggages", "value": 3 }, { "display_name": "4 luggages", "value": 4 }, { "display_name": "5 luggages", "value": 5 } ] }, "year": { "type": "choice", "required": false, "read_only": false, "label": "year", "choices": [ { "display_name": "---------", "value": "" }, { "display_name": 2014, "value": 2014 }, { "display_name": 2013, "value": 2013 }, { "display_name": 2012, "value": 2012 }, { "display_name": 2011, "value": 2011 }, { "display_name": 2010, "value": 2010 }, { "display_name": 2009, "value": 2009 }, { "display_name": 2008, "value": 2008 }, { "display_name": 2007, "value": 2007 }, { "display_name": 2006, "value": 2006 }, { "display_name": 2005, "value": 2005 }, { "display_name": 2004, "value": 2004 }, { "display_name": 2003, "value": 2003 }, { "display_name": 2002, "value": 2002 }, { "display_name": 2001, "value": 2001 }, { "display_name": 2000, "value": 2000 }, { "display_name": 1999, "value": 1999 }, { "display_name": 1998, "value": 1998 }, { "display_name": 1997, "value": 1997 }, { "display_name": 1996, "value": 1996 } ] } } } }
Use this resource to get information about a driver
| Field | Description | Editable
|---|---|---|---|---|
|url |Driver's absolute URL | No |
|user |User | No |
|stats |Provides stats about driver such as the number or rides given, the overall distance of rides & the balance. This field is shown only if the authenticated user is the concerned driver|No |
|license_scan |Driver license image|Yes |
|insurance_scan |Insurance image|Yes |
|license_number |Driver license number |Yes |
|license_country |Country where the driver license was provided|Yes |
|license_state |State where the driver license was provided (only valid for the US for now)|Yes |
|paypal_account |Email of the Paypal account to be used for transfering money |Yes |
|insurance_policy_number|Insurance policy number |Yes |
|insurance_company |Company that provided the insurance|Yes |
|confirmed |Confirmed driver or not|No |
|drive_distance |How far can the user go from his city|Yes |
|smart_phone_type |Smart phone type|Yes |
|availability |0
for unvailable. 1
for taking only scheduled rides. 2
for taking instant rides as well|Yes |
-
Parameters
- id (required, number) ... The driver profile id
-
Request
-
Headers
Accept: application/json Authorization: Token {user-token}
-
-
Response 200 (application/json)
{ "license_scan": "https://www.friendryde.com/media/users/licence/scan.png", "insurance_scan": "http://www.friendryde.com/media/users/insurance/736778.jpg", "stats": { "rides_given": 5, "distance": { "mi": 19.01, "m": 30600, "km": 30.6 }, "balance": { "USD": 560, "MAD": 4882.64 } }, "url": "http://api.friendryde.com/v1/driver/15/", "license_number": null, "license_country": null, "license_state": null, "paypal_account": null, "insurance_policy_number": null, "insurance_company": null, "confirmed": false, "drive_distance": 50, "smart_phone_type": null, "availability": 0, "user": "http://api.friendryde.com/v1/user/52/" }
Use this resource to update the driver's information.
-
Parameters
- id (required, number,
25
) ... The driver profile id - insurance_scan (optional, image file, ``) ... Insurance image
- insurance_policy_number (optional, string, ``) ... Insurance policy number
- insurance_company (optional, string, ``) ... Company that provided the insurance
- license_scan (optional, image file, ``) ... Driver license image.
- license_country (optional, string,
US
) ... two-letter country codes following the ISO 3166-1 alpha-2 standard - license_state (optional, string,
CA
) ... two-letter USA state code - license_number (optional, string, ``) ... Driver license number
- availability (required, integer,
2
) ...0
for unvailable.1
for taking only scheduled rides.2
for taking instant rides. - smart_phone_type (optional, string,
Android
) ... Possible options are :Android
,iPhone
,Windows Phone
orother
- drive_distance (required, integer,
100
) ... How far can the user go from his city (in km). Possible values are :50
,100
,250
,500
,1000
. - paypal_account (optional, string,
true
) ... Email of the Paypal account to be used for transfering money
- id (required, number,
-
Request
-
Headers
Authorization: Token {user-token}
-
-
Response 200 (application/json)
{ "url": "https://api.friendryde.com/v1/user/52/", "avatar": "http://www.friendryde.com/media/avatar/52.jpg", "id": 52, "email": "john.doe@gmail.com", "city": "Rabat, Morocco", "country": "MA", "full_name": "John Doe", "driverprofile": "http://api.friendryde.com/v1/driver/15/", "phone_number": "+21260000000", "first_name": "John", "last_name": "Doe", "car": "https://api.friendryde.com/v1/car/14/", "truncated_name": "John d.", "user_type": "driver", "rating": { "count": 0, "score": null }, "reviews_url": "http://api.friendryde.com/v1/user/52/reviews/", "languages": [ "English", "Arabic", "Moroccan Arabic", "Berber", "French" ] }
-
Response 400
{ "availability": [ "Select a valid choice. 654 is not one of the available choices." ] }
Returns the rides specific to the authenticated driver. Rides are divided to 3 categories:
- pending : List of rides that has no driver yet and are waiting for driver confirmation
- confirmed : List of rides confirmed by the driver that
- past : List of rides that has been completed
-
Request
-
Headers
Authorization: Token {user-token}
-
-
Response 200 (application/json)
{ "past": [], "confirmed": [], "pending": [] }
-
Parameters
- coupon_code (required, string) ... The coupon to be used.
- price (required, string) ... Price in USD to be discounted.
-
Request
-
Headers
Authorization: Token {user-token}
-
-
Response 200 (application/json)
{ "original_price": { "USD": 50, "MAD": 435.95 }, "price": { "USD": 25, "MAD": 217.97 } }
-
Response 400
{ "detail": { "code": [ "Invalid coupon." ] } }
There are 2 steps for the scheduled ride search process:
- Car type selection
- Drivers selection
This resource returns a list of the car types available for the query string provided
Response fields:
car_make
: Example of a matching car makecar_model
: Example of a matching car model availableimage
: Example of a car image availablecar_type
: Car typeoriginal_price
: Price that would be applied if no discount is madeprice
: Price that would be a discount code is useddrivers-url
: URL to the drivers selection endpointdriver
:count
: Number of drivers available for a car typetruncated_name
: Truncated name of one of the drivers available for this car typeavatar
: Avatar of one of the drivers available for this car type
-
Parameters
- source (required, string,
Barcelona El Prat Airport
) ... Pickup address. - destination (required, string,
Plaça Catalunya, Barcelona
) ... Dropoff address. - needed_on_date (required, string,
20/10/2014
) ... date when the ride is needed. If value is wrong, error is rendered underneeded_on
field - needed_on_time (required, string,
22:00
) ... time when the ride is needed. If value is wrong, error is rendered underneeded_on
field - seats (optional, integer,
2
) ... Number of passengers. Possible values1..6
- luggage (optional, integer,
2
) ... Number of luggage that will need to be carried. Possible values1..5
- source (required, string,
-
Request
-
Headers
Authorization: Token {user-token}
-
-
Response 200
[ { "car_make": "audi", "car_model": "A1", "image": "https://www.friendryde.com/users/car/Audi-A1.jpg", "car_type": "Economy", "original_price": { "USD": 134, "MAD": 1100 }, "price": { "USD": 134, "MAD": 1100 }, "drivers-url": "https://api.friendryde.com/v1/search/Economy/drivers/?source=Helsinki&needed_on_date=20%2F10%2F2014&destination=Turku&needed_on=20%2F10%2F2014+10%3A20&needed_on_time=10%3A20", "driver": { "count": 2, "truncated_name": "Zahim A.", "avatar": "https://www.friendryde.com/media/avatar/34.jpg" } } ]
-
Response 400
{ "detail": { "source": [ "This field is required." ], "destination": [ "This field is required." ], "needed_on": [ "This field is required." ] } }
-
Parameters
- car_type (required, string,
Economy
) ... Car type. Possible options are :Economy
,Standard
,SUV
,Luxury
orMinivan
. Values are case sensitive - source (required, string,
Barcelona El Prat Airport
) ... Pickup address. - destination (required, string,
Plaça Catalunya, Barcelona
) ... Dropoff address. - needed_on_date (required, string,
20/10/2014
) ... date when the ride is needed. If value is wrong, error is rendered underneeded_on
field - needed_on_time (required, string,
22:00
) ... time when the ride is needed. If value is wrong, error is rendered underneeded_on
field - seats (optional, integer,
2
) ... Number of passengers. Possible values1..6
- luggage (optional, integer,
2
) ... Number of luggage that will need to be carried. Possible values1..5
- car_type (required, string,
-
Request
-
Headers
Authorization: Token {user-token}
-
-
Response 200
[ { "car_make": "audi", "car_model": "A1", "image": "https://www.friendryde.com/users/car/Audi-A1.jpg", "car_type": "Economy", "original_price": { "USD": 134, "MAD": 1100 }, "price": { "USD": 134, "MAD": 1100 }, "drivers-url": "https://api.friendryde.com/v1/search/Economy/drivers/?source=Helsinki&needed_on_date=20%2F10%2F2014&destination=Turku&needed_on=20%2F10%2F2014+10%3A20&needed_on_time=10%3A20", "driver": { "count": 2, "truncated_name": "Zahim A.", "avatar": "https://www.friendryde.com/media/avatar/34.jpg" } } ]
-
Response 400
{ "detail": { "source": [ "This field is required." ], "destination": [ "This field is required." ], "needed_on": [ "This field is required." ] } }
Returns drivers nearby provided coordinates.
-
Parameters
- lat (required, number,
36.512456
) ... Latitude - lng (required, number,
57.512456
) ... Longitude
- lat (required, number,
-
Request (application/json)
-
Headers
Authorization: Token {user-token}
-
-
Response 200
[ { "last_seen": "2014-09-30T12:52:23.137", "user": 34, "loc": { "type": "Point", "coordinates": [ 36.512429, 57.512445 ] } } ]
-
Response 400
{ "detail": { "lat": [ "This field is required." ], "lng": [ "This field is required." ] } }
A ride has many different statuses:
created
: Ride was created.pending
: Ride is paid and requests are sent to adequate driversconfirmed
: The driver has confirmed the rideclient_confirmed
: In instant rides, when traveler confirms he wants that driver.declined
: When the driver declines to give the ridecanceled
: When the rider or the driver cancels a ride.started
: The rider has entered his personal code after pick-up.done
: The rider has entered his personal code after drop-off.pickup_checkin
: The driver checked in at the pickup location.dropoff_checkin
: The driver checked in at the drop-off location.
At this step the ride's status is created
.
-
Parameters
- car_type (required, string,
Economy
) ... Car type. Possible options are :Economy
,Standard
,SUV
,Luxury
orMinivan
. Values are case sensitive - source (required, string,
Barcelona El Prat Airport
) ... Pickup address. - destination (required, string,
Plaça Catalunya, Barcelona
) ... Dropoff address. - needed_on (required, string,
2014-10-20T20:53
) ... date when the ride is needed. format :YYYY-MM-DDTHH:MM
- seats (optional, integer,
2
) ... Number of passengers. Possible values1..6
- luggage (optional, integer,
2
) ... Number of luggage that will need to be carried. Possible values1..5
- ride_type (optional, string,
instant
) ... Possible options are :instant
orscheduled
, defaults to instant. - coupon_code (optional, string,
SpecialCode
) ... Discount code - cars_to_contact (required, CSV,
542,654,12
) ... Comma seperated ids of cars to be contacted. - comment (optional, string) ... Comment left by the traveler
- car_type (required, string,
-
Request
-
Headers
Authorization: Token {user-token}
-
-
Response 201
{ "user": { "url": "https://api.friendryde.com/v1/user/35/", "avatar": "https://www.friendryde.com/media/avatar/6868.jpg", "id": 35, "email": "zanass0@gmail.com", "city": "Agdal, Rabat, Rabat-Sale-Zemmour-Zaer, Morocco", "country": null, "full_name": "John Doe", "driverprofile": null, "phone_number": "+212600112233", "first_name": "John", "last_name": "Doe", "car": null, "truncated_name": "John D.", "user_type": "rider", "rating": { "count": 1, "score": 4 }, "reviews_url": "https://api.friendryde.com/v1/user/35/reviews/", "languages": [ "English", "Arabic", "Moroccan Arabic", "Berber", "French", "Français" ] }, "effective_price": { "USD": 60, "MAD": 492 }, "estimated_price": { "USD": 0, "MAD": 0 }, "driver_fare": { "USD": "51.30", "MAD": 421 }, "coupon": 1, "requests": { "count": 1, "url": "http://localhost.com:8000/v1/ride/354/requests/" } "comments": [], "car": null, "url": "https://api.friendryde.com/v1/ride/354/", "status": "created", "car_type": "Economy", "distance": 165781, "duration": 6277, "source": "Helsinki", "destination": "Turku", "source_point": { "type": "Point", "coordinates": [ 24.9410248, 60.17332440000001 ] }, "destination_point": { "type": "Point", "coordinates": [ 22.2666303, 60.4518126 ] }, "needed_on": "2012-12-20T14:20:00", "seats": 1, "luggage": 1, "ride_type": "scheduled" }
-
Response 400
{ "source": [ "This field is required." ], "destination": [ "This field is required." ], "needed_on": [ "This field is required." ] }
-
Request
-
Headers
Authorization: Token {user-token}
-
-
Response 200 (application/json)
{ "name": "Ride list", "description": "", "renders": [ "application/json", "text/html" ], "parses": [ "application/json", "application/x-www-form-urlencoded", "multipart/form-data" ], "actions": { "PUT": { "user": { "type": "field", "required": false, "read_only": true }, "effective_price": { "type": "field", "required": false, "read_only": true }, "estimated_price": { "type": "field", "required": false, "read_only": true }, "driver_fare": { "type": "field", "required": false, "read_only": true }, "coupon": { "type": "field", "required": false, "read_only": true }, "requests": { "type": "field", "required": false, "read_only": true }, "comments": { "type": "field", "required": false, "read_only": true }, "car": { "type": "field", "required": false, "read_only": true }, "id": { "type": "integer", "required": false, "read_only": true, "label": "ID" }, "status": { "type": "choice", "required": true, "read_only": true, "label": "status", "choices": [ { "display_name": "created", "value": "created" }, { "display_name": "confirmed", "value": "confirmed" }, { "display_name": "pending", "value": "pending" }, { "display_name": "declined", "value": "declined" }, { "display_name": "canceled", "value": "canceled" }, { "display_name": "client_confirmed", "value": "client_confirmed" }, { "display_name": "pickup_checkin", "value": "pickup_checkin" }, { "display_name": "dropoff_checkin", "value": "dropoff_checkin" }, { "display_name": "started", "value": "started" } ] }, "car_type": { "type": "choice", "required": false, "read_only": false, "label": "car type", "choices": [ { "display_name": "---------", "value": "" }, { "display_name": "Economy", "value": "Economy" }, { "display_name": "Standard", "value": "Standard" }, { "display_name": "SUV (4x4)", "value": "SUV" }, { "display_name": "Minivan", "value": "Minivan" }, { "display_name": "Luxury", "value": "Luxury" } ] }, "distance": { "type": "integer", "required": true, "read_only": true, "label": "distance", "help_text": "Distance in meters" }, "duration": { "type": "integer", "required": true, "read_only": true, "label": "duration", "help_text": "Duration in seconds" }, "source": { "type": "string", "required": true, "read_only": false, "label": "From", "max_length": 255 }, "destination": { "type": "string", "required": true, "read_only": false, "label": "To", "max_length": 255 }, "source_point": { "type": "field", "required": false, "read_only": true, "label": "source point" }, "destination_point": { "type": "field", "required": false, "read_only": true, "label": "destination point" }, "needed_on": { "type": "datetime", "required": true, "read_only": false, "label": "needed on" }, "seats": { "type": "choice", "required": true, "read_only": false, "label": "seats", "choices": [ { "display_name": "1 passenger", "value": 1 }, { "display_name": "2 passengers", "value": 2 }, { "display_name": "3 passengers", "value": 3 }, { "display_name": "4 passengers", "value": 4 }, { "display_name": "5 passengers", "value": 5 }, { "display_name": "6 passengers", "value": 6 } ] }, "luggage": { "type": "choice", "required": true, "read_only": false, "label": "luggage", "choices": [ { "display_name": "1 luggage", "value": 1 }, { "display_name": "2 luggages", "value": 2 }, { "display_name": "3 luggages", "value": 3 }, { "display_name": "4 luggages", "value": 4 }, { "display_name": "5 luggages", "value": 5 } ] }, "ride_type": { "type": "choice", "required": true, "read_only": false, "label": "ride type", "choices": [ { "display_name": "scheduled", "value": "scheduled" }, { "display_name": "instant", "value": "instant" } ] } } } }
-
Parameters
- id (required, integer,
89
) ... Ride's id
- id (required, integer,
-
Request
-
Headers
Authorization: Token {user-token}
-
-
Response 200
{ "user": { "url": "https://api.friendryde.com/v1/user/35/", "avatar": "https://www.friendryde.com/media/avatar/6868.jpg", "id": 35, "email": "zanass0@gmail.com", "city": "Agdal, Rabat, Rabat-Sale-Zemmour-Zaer, Morocco", "country": null, "full_name": "John Doe", "driverprofile": null, "phone_number": "+212600112233", "first_name": "John", "last_name": "Doe", "car": null, "truncated_name": "John D.", "user_type": "rider", "rating": { "count": 1, "score": 4 }, "reviews_url": "https://api.friendryde.com/v1/user/35/reviews/", "languages": [ "English", "Arabic", "Moroccan Arabic", "Berber", "French", "Français" ] }, "effective_price": { "USD": 60, "MAD": 492 }, "estimated_price": { "USD": 0, "MAD": 0 }, "driver_fare": { "USD": "51.30", "MAD": 421 }, "coupon": 1, "requests": { "count": 1, "url": "http://localhost.com:8000/v1/ride/354/requests/" } "comments": [], "car": null, "url": "https://api.friendryde.com/v1/ride/354/", "status": "created", "car_type": "Economy", "distance": 165781, "duration": 6277, "source": "Helsinki", "destination": "Turku", "source_point": { "type": "Point", "coordinates": [ 24.9410248, 60.17332440000001 ] }, "destination_point": { "type": "Point", "coordinates": [ 22.2666303, 60.4518126 ] }, "needed_on": "2012-12-20T14:20:00", "seats": 1, "luggage": 1, "ride_type": "scheduled", "id": 89 }
#Scheduled ride requests
-
Parameters
- id (required, integer,
282
) ... Ride id
- id (required, integer,
-
Request (application/json)
-
Headers
Authorization: Token {user-token}
-
-
Response 200
[ { "car":{ "image":"http://localhost.com:8005/media/users/car/renewing-the-photo-on-your-driving-license-347-image1_1.jpg", "car_make_display":"Alfa Romeo", "seats_display":"1 passenger", "luggage_display":"1 luggage", "url":"/api/v1/car/1/", "user":"/api/v1/user/1/", "car_make":"alfa-romeo", "car_model":"a", "seats":1, "doors":4, "car_type":"Economy", "has_ac":false, "wheelchair":false, "luggage":1, "year":2014 }, "id":16, "status":"taken" } ]
-
Response 400
{ "detail": { "reason": [ "This field is required." ], "__all__": [ "You have already cancelled this ride" ] } }
#Ride cancellation
-
Parameters
- id (required, integer,
282
) ... Ride id - reason (required, string,
Car is down
) ... Reason why the user cancelled the ride
- id (required, integer,
-
Request (application/json)
-
Headers
Authorization: Token {user-token}
-
Body
{"reason": "Car is down"}
-
-
Response 200
{ "detail": "Ride cancelled" }
-
Response 400
{ "detail": { "reason": [ "This field is required." ], "__all__": [ "You have already cancelled this ride" ] } }
#Ride declination
-
Parameters
- id (required, integer,
282
) ... Ride id - reason (required, string,
Not available
) ... Reason why the driver declined the ride
- id (required, integer,
-
Request
-
Headers
Authorization: Token {user-token}
-
-
Response 200
{ "detail": "Ride declined - Thank you." }
-
Response 400
{ "detail": { "reason": [ "This field is required." ], "__all__": [ "You have already declined this ride" ] } }
#Ride acceptation
-
Parameters
- id (required, integer,
282
) ... Ride id
- id (required, integer,
-
Request
-
Headers
Authorization: Token {user-token}
-
-
Response 200
{ "message": "Your ride is now confirmed.", "success": true }
-
Response 400
{ "message": [ "Too late ! The pickup was already accepted by another driver" ], "success": false }
#Pickup checkin Done by driver.
If the checkin succeeds an empty response body is return with a 200
status code
-
Parameters
- id (required, integer,
282
) ... Ride id - lat (required, number,
36.512456
) ... Latitude of current check in location - lng (required, number,
57.512456
) ... Longitude of current check in location
- id (required, integer,
-
Request
-
Headers
Authorization: Token {user-token}
-
-
Response 200
-
Response 400
{ "detail": { "__all__": [ "You can't do check-in now" ] } }
#Boarding Done by driver.
If the checkin succeeds an empty response body is return with a 200
status code
-
Parameters
- id (required, integer,
282
) ... Ride id - lat (required, number,
36.512456
) ... Latitude of current check in location - lng (required, number,
57.512456
) ... Longitude of current check in location
- id (required, integer,
-
Request
-
Headers
Authorization: Token {user-token}
-
-
Response 200
-
Response 400
{ "detail": { "__all__": [ "You can't do check-in now" ] } }
#Drop off checkin Done by driver.
If the checkin succeeds an empty response body is return with a 200
status code
-
Parameters
- id (required, integer,
282
) ... Ride id - lat (required, number,
36.512456
) ... Latitude of current check in location - lng (required, number,
57.512456
) ... Longitude of current check in location
- id (required, integer,
-
Request
-
Headers
Authorization: Token {user-token}
-
-
Response 200
-
Response 400
{ "detail": { "__all__": [ "You can't do check-in now" ] } }
#Add review Once the ride is achieved. Both driver and traveler should give a review
If the checkin succeeds an empty response body is return with a 200
status code
-
Parameters
- id (required, integer,
282
) ... Ride id - lat (required, number,
36.512456
) ... Latitude of current check in location - lng (required, number,
57.512456
) ... Longitude of current check in location
- id (required, integer,
-
Request (application/json)
-
Headers
Authorization: Token {user-token}
-
Body
{ "comment": "Great guy !", "score": 4 }
-
-
Response 200
{ "comment": "Great guy !", "id": 16, "score": 4, "creation_date": "2014-09-30T19:02:14.149Z" }
-
Response 400
{ "detail": { "__all__": [ "You have already rated this ride" ] } }
-
Response 403
{ "detail": "You can't rate this ride" }
#Change driver - instant ride Used when a user wants to change the first driver who accepted the ride.
- The driver can be changed only once.
- If the change succeeds an empty response body is return with a
200
status code
-
Parameters
- id (required, integer,
282
) ... Ride id
- id (required, integer,
-
Request (application/json)
-
Headers
Authorization: Token {user-token}
-
-
Response 200
-
Response 400
{ "detail": { "__all__": [ "You can't change a driver twice." ] } }
#Confirm driver - instant ride When a traveler books an instant ride, requests are sent to drivers. The ones who accept the ride should be confirm by the traveler. Use this resource for that.
If the checkin succeeds an empty response body is return with a 200
status code
-
Parameters
- id (required, integer,
282
) ... Ride id - driver (required, integer,
212
) ... The driver's user id
- id (required, integer,
-
Request
-
Headers
Authorization: Token {user-token}
-
-
Response 200
-
Response 400
{ "detail": { "ryde": [ "Select a valid choice. That choice is not one of the available choices." ], "driver": [ "This field is required." ] } }
Payment authorization with Stripe
Returns FriendRyde payment id
-
Parameters
- id (required, integer,
282
) ... Ride id - token (required, integer,
tok_14iwNp20fsbcrfjkp8eTEgsf
) ... Token provided by Stripe for transaction
- id (required, integer,
-
Request
-
Headers
Authorization: Token {user-token}
-
-
Response 200
{ "payment": 654 }
-
Response 400
{ "detail": { "error": { "message": "You cannot use a Stripe token more than once: tok_14iwNp20fsbcrfjkp8WTEgsf", "type": "invalid_request_error" } } }
https://docs.google.com/a/soovox.com/drawings/d/18zovNNq6puPaXoIG9hILkoy0CYbdavW1hLGe2-o0q4M/edit
Using this endpoint, a transaction is created on Payzone side.
The user should be redirected to the payment page which is the payment_url
field in the response
-
Parameters
- id (required, integer,
282
) ... Ride id
- id (required, integer,
-
Request
-
Headers
Authorization: Token {user-token}
-
-
Response 200
{ "customer_token": "59e1d47df61bf92bdd4af0a005946bb0984b35ba39c1b1646cf79ec5d33a3b1e31c4e652bf3b94ab1e6fb0db65936445c40e8462449ba2aa593028b6fb81BTlzyePH7_9GnGpnIsYjs5n_PbJNJqdQLLgFL8wQXyTclZVcYCy41IpF7AKeiMtu6zsnjN6QH-uriGa_dkT0YoAJTcYu4O5J1oOTCNT6OJXBI75mK3yytFEZECMEcDqltbPKmrOTmWEKJpr4vx_v9CVS9f9K1pFBVZrodUPNkwMQDYRAmiV6v9JlgF0uLu-f83wXwdi_L1f6mfc0-6-4ag", "message": "New transaction created successfully.", "code": "200", "amount": "2396.92", "payment_url": "https://paiement.payzone.ma/transaction/59e1d47df61bf92bdd4af0a005946bb0984b35ba39c1b1646cf79ec5d33a3b1e31c4e652bf3b94ab1e6fb0db65936445c40e8462449ba2aa593028b6fb81BTlzyePH7_9GnGpnIsYjs5n_PbJNJqdQLLgFL8wQXyTclZVcYCy41IpF7AKeiMtu6zsnjN6QH-uriGa_dkT0YoAJTcYu4O5J1oOTCNT6OJXBI75mK3yytFEZECMEcDqltbPKmrOTmWEKJpr4vx_v9CVS9f9K1pFBVZrodUPNkwMQDYRAmiV6v9JlgF0uLu-f83wXwdi_L1f6mfc0-6-4ag/dopay" }
Status :
not processed
: Transaction created but the user didn't proceed to payment yet.authorized
: Transaction authorizednot authorized
:expired
: Transaction created but not processed for a long period of time until it got expiredcall failed
-
Parameters
- id (required, integer,
282
) ... Ride id
- id (required, integer,
-
Request
-
Headers
Authorization: Token {user-token}
-
-
Response 200
{ "status": "not processed", "id": 0 }
Required fields :
iban_number
: IBAN and RIB accounts can be stored in this field
-
Request
-
Headers
Authorization: Token {user-token}
-
Body
{ "iban_number": "654987123", }
-
-
Response 200
{ "user": "https://api.friendryde.com/v1/user/2/", "iban_number": "654987123", "url": "https://api.friendryde.com/v1/withdrawal/wiretransfer/6/" }
-
Parameters
- id (required, integer,
45
) ... Wire transfer account id
- id (required, integer,
-
Request
-
Headers
Authorization: Token {user-token}
-
-
Response 200
{ "user": "https://api.friendryde.com/api/v1/user/81/", "iban_number": "654987123", "url": "https://api.friendryde.com/api/v1/withdrawal/wiretransfer/{id}/" }
-
Parameters
- id (required, integer,
45
) ... Wire transfer account id
- id (required, integer,
-
Request
-
Headers
Authorization: Token {user-token}
-
Body
{ "iban_number": "123123123", }
-
-
Response 200
{ "user": "https://api.friendryde.com/api/v1/user/81/", "iban_number": "123123123", "url": "https://api.friendryde.com/api/v1/withdrawal/wiretransfer/{id}/" }
Notifications are sent to Android devices using Google Cloud Messaging.
In order to receive notifications the users device registration id should be sent to server using this endpoint /v1/user/set-registration-id/
{
"type": "{notification-type}",
"ride": {
"type": "{ryde_type}",
"id": {ride_id},
}
}
notification-type
: This field defines the type of notificationryde_type
: Possible values areinstant
&scheduled
.ride_id
: Ex: 10
Whenever a ride status changes, we send a notification to the traveler and driver (if any).
- Receivers : Traveler, driver.
{
"type": "ride-status-changed",
"ride": {
"type": {ryde_type},
"id": {ride_id},
"status": {ride_status},
"modified_at": "{ride_status_modified_at}"
}
}
ride_status
: Current new ride status. Ex: pickup_checkinride_status_modified_at
: Date/time of ride status. Ex: 2014-11-14 11:45:40.256912+00:00
This notification is sent to drivers when a traveler requests a ride
- Receiver : Drivers
{
"type": "new-ride",
"ride": {
"type": "instant",
"id": {ride_id},
}
}
This notification is sent to the traveler when a driver confirms his ride.
- Receiver : Traveler
{
"type": "ride-driver-confirmed",
"ride": {
"type": {ryde_type},
"id": {ride_id},
}
}
This notification is sent to the driver who confirmed an instant ride when the user confirms he wants to have the ride with him.
- Receiver : Driver
{
"type": "ride-traveler-confirmed-driver",
"ride": {
"type": "instant",
"id": {ride_id},
}
}
This notification is sent to the traveler when the driver arrives at pickup place.
- Receiver : Traveler
{
"type": "driver-pickup-checkin",
"ride": {
"type": {ryde_type},
"id": {ride_id},
}
}
This notification is sent to the traveler when a driver nearby changes his position
- Receiver : Traveler
{
"type": "driver-position",
"user": {
"loc": {
"type": "Point",
"coordinates": {coords}
},
"id": {user_id},
"last_seen": "{last_seen}"}
}
}
coords
: Geo coordinates of the last tracked positionuser_id
: Driver's user idlast_seen
: Last time driver position was tracked. Ex: 2014-11-12 13:15:16.061243+00:00
Each time a driver changes position (POST /v1/user/position/), a notification is sent to travelers near him.
If used to show movement of a driver picking up his traveler, you should manually filter on your application using user.id field, user.id being the concerned driver id.
- If used in a map containing drivers, this notification should be used to update drivers position.
Use this method to get updates about drivers nearby's positions. Please note the response is a stream, which mean API consumer should listen to it constantly
-
Parameters
- id (required, integer,
282
) ... Traveler ID
- id (required, integer,
-
Response 200
{'id': 3,'channel': 'drivers-nearby-50','text': '{"loc": {"type": "Point", "coordinates": [-6.828922, 34.018381]}, "u": {"id": 1, "d": true}, "t": "2014-11-12 12:19:40.441173+00:00"}','event_id': '', 'time': 'Wed, 12 Nov 2014 12:19:42 GMT', 'tag': '1'}