This is an unofficial documentation of the Venmo iOS app API. The API base route is: https://api.venmo.com/v1/
A Python wrapper for the Venmo API, here: github.com/mmohades/venmo
Disclaimer: This is an individual effort and is not PayPal/Venmo sponsored or maintained.
The API base route is https://api.venmo.com/v1
. In this section, you will find an overview of the API endpoints, parameter description, request body schemas, and request header schemas. You can read more and see examples of each one by clicking on the endpoint.
Resource | Description | Request Header Id | Request Body Id |
---|---|---|---|
POST /oauth/access_token |
Login using credentials or 2-factor. | 1 | 1 |
GET /account/two-factor/token?client_id=1 |
Get the 2-factor authentication options. (sms, etc). | 2 | |
POST account/two-factor/token |
Ask Venmo to send you an OTP as a Text. | 3 | 2 |
Resource | Description | Request Header Id | Request Body Id |
---|---|---|---|
DELETE /oauth/access_token |
Sign-Out, revoke the provided Access Token. | 4 | |
GET /me |
Get your user profile. | 5 | |
GET /users/{user-id} |
Get a user's public profile. | 4 | |
GET /users/{user-id}/friends |
Get a user's friend's list. | 4 | |
GET /stories/{transaction-id} |
Get a specific transaction information. | 4 | |
GET /stories/target-or-actor/{user-id} |
Get a list of the user's transactions. | 4 | |
GET /payment-methods |
Get the payment methods list, Venmo Balance, etc | 4 | |
POST /payments |
Make a payment or request money. | 5 | 3 or 4 |
Name | Possible Value | Description |
---|---|---|
amount | 12.2 | $12.20, the amount to charge or send in dollars. For charging, the number must be negative. |
audience | private | enum { private, friends, public } The privacy of your payment. |
Authorization | Bearer <token> |
Your Access Token |
device-id | 88884260-05O3-8U81-58I1-2WA76F357GR9 |
Phone's unique identifier that never changes. |
funding_source_id | 1513921002697097045 | Payment Id, basically the source of the money that you are sending. For example, it can be your Venmo Balance or Bank Account. |
note | Pizza 🍕 | The note of your transaction. |
Payment-id | 1513921002697097045 | Payment method's unique identifier, like your Venmo Balance Id or your Bank Checking account Id. |
password | password123456 | The user's account password in plain-text. |
phone_email_or_username | email@example.com | The user's account email address or username. |
transaction-id | 4246290347126270993 | Transaction unique identifier. |
user-id | 4696228937479104362 | User unique identifier. |
Venmo-Otp | 123456 | Venmo OTP received by text. |
venmo-otp-secret | H02SO0WYEJKMLMC4... |
Temporary Identifier of a user required by all the 2-Factor requests. Expires in minutes. |
index | Keys |
---|---|
1 | device-id, Content-Type |
2 | device-id, venmo-otp-secret |
3 | device-id, venmo-otp-secret, Content-Type |
4 | device-id, venmo-otp-secret, Venmo-Otp, User-Agent |
5 | Authorization |
6 | Authorization, Content-Type |
Index | Keys |
---|---|
1 | { "phone_email_or_username": "", "client_id": "1","password": ""} |
2 | { "via": "sms" } |
3 | { "funding_source_id": 0, "metadata": { "quasi_cash_disclaimer_viewed": false }, "user_id": 0, "audience": "", "amount": 1, "note": "" } |
4 | { "note": "", "metadata": { "quasi_cash_disclaimer_viewed": false }, "amount": -1, "user_id": 0, "audience": "" } |
Open endpoints do not require the Authentication Token. However, they can be used to get the Authentication Token required by other methods.
Each endpoint is related to the login process, including the two factor authentication and the final goal is to get the authorization token and use that in the routes that require Authentication. The token never expires, unless you logout.
Login in using your username and password in plain-text. Remember, if the device-id
is trusted by your account, it will work. Otherwise, you will have to follow the 2-factor auth. process.
POST
/oauth/access_token
Header
Key | Example Value | Required | Description |
---|---|---|---|
device-id | 88884260-05O3-8U81-58I1-2WA76F357GR9 |
True | Mobile Unique Device Id |
Content-Type | application/json | True | Identifying the body |
Host | api.venmo.com | False |
Body
{
"phone_email_or_username": "email@user.com",
"client_id": "1",
"password": "password123456"
}
Status: 400 Bad Request
Status: 401 Unauthorized
This means username and password was correct, but additional verification is required since the device-id is unknown for your account. You will need to do two additional steps for logging in with 2-factor. 1. Request for the text message to be sent to your phone. 2. Send the code
you received on your phone to the Venmo and the venmo-otp-secret
using this route.
Header
Key | Value |
---|---|
venmo-otp | required; two_factor |
venmo-otp-secret | H02SO0WYEJKMLMC4TFKN5YZ7WHOJO4PAWCP8HFLP8NZANO2IDRCQJ5J1GGYNYXSP |
Body
{
"error": {
"url": "https://venmo.com/two-factor",
"message": "Additional authentication is required",
"code": 81109,
"links": null,
"title": "Error"
}
}
Status: 200 OK
Body
{
"access_token": "28735RJZ0MG3378R8HV6946Y64D077930MZO29REK1RQ7493966107H64P7764AG",
"balance": 200.2,
"user": {
"username": "user",
"phone": "18558124430",
"first_name": "Random",
"last_name": "Name",
"display_name": "Random Name",
"profile_picture_url": "https://s3.amazonaws.com/venmo/no-image.gif",
"id": "3020735175772533188",
"email": "random@email.com"
}
}
Get the two-factor authentication options that you have for your account.
GET
/account/two-factor/token?client_id=1
Request Header
Key | Example Value | Required | Description |
---|---|---|---|
device-id | 88884260-05O3-8U81-58I1-2WA76F357GR9 | True | Mobile Unique Device Id |
venmo-otp-secret | H02SO0WYEJKMLMC4TFKN5YZ7WHOJO4PAWCP8HFLP8NZANO2IDRCQJ5J1GGYNYXSP |
True | The otp-secret that you receive in the response header when first try to login with username and password. |
Status: 400 Bad Request
Body
{
"error": {
"message": "Your code has expired. Sign in again and we'll send you a new code.",
"code": 81110,
"links": null,
"title": "Error"
}
}
Status: 200 OK
Body
{
"data": {
"questions": [
{
"value": "Capital One, N.a. Checking Account",
"question_type": "bank"
}
],
"devices": [
{
"value": "(XXX) XXX - 1234",
"device_type": "sms"
}
],
"braintree": {
"braintree_merchant_id": "BVC6R3Z8ONVTWLAD",
"braintree_use_prod": "true",
"braintree_cse_public_key": "WUIUVNTLRCUODNBWHC3ICAQJ1SCLCJJRIMLACUKGJLYIOOAKIRN2ISTKDFLIM90WZYZANYRRZAPT9WO3OXZYTFN8REGK3ZFW76PNPQY9LXVQ5FBGQSAEEJDRHBHIQICZCXHKQ7QGQKATXUBIM8UPPXEFH4JRNWZZJNG0TR7U09EFAOF9OMTYPLEW1HUKRXIF6GH7RGAP7M1CUFVUFNMKAJYTMPBFYJZOMTMEBJNCVGOGAQWQFBZEI612BBWR7PG6DP68LZMSURVFITLFUQL6J9BZN8VEHZBIJG3X7UFG0K5VTZDJI7MLRIYCLEI4HGMRIPGZMC3VCF28NQUHOKAAMJ9ZHE1RITTXAYZUOAYD"
}
}
}
Ask Venmo to text you the 2-factor code.
POST
account/two-factor/token
Header
Key | Example Value | Required | Description |
---|---|---|---|
device-id | 88884260-05O3-8U81-58I1-2WA76F357GR9 | True | Mobile Unique Device Id |
venmo-otp-secret | H02SO0WYEJKMLMC4TFKN5YZ7WHOJO4PAWCP8HFLP8NZANO2IDRCQJ5J1GGYNYXSP |
True | The otp-secret that you receive in the response header when first try to login with username and password |
Content-Type | application/json | True | Send the server the body content type that is Json. |
Body
{ "via": "sms" }
Status: 400 Bad Request
Body
{
"error": {
"message": "Your code has expired. Sign in again and we'll send you a new code.",
"code": 81110,
"links": null,
"title": "Error"
}
}
Status: 200 OK
Body
{
"data": {
"status": "sent"
}
}
Login using your one-time password that received by text.
POST
/oauth/access_token?client_id=1
Header
Key | Example Value | Required | Description |
---|---|---|---|
device-id | 88884260-05O3-8U81-58I1-2WA76F357GR9 | True | Mobile Unique Device Id |
venmo-otp-secret | H02SO0WYEJKMLMC4TFKN5YZ7WHOJO4PAWCP8HFLP8NZANO2IDRCQJ5J1GGYNYXSP |
True | The otp-secret that you receive in the response header when first try to login with username and password |
Venmo-Otp | 123456 | True | OTP received by text. |
User-Agent | Venmo/7.38.0 (iPhone; iOS 13.0; Scale/2.0) | False |
Status: 400 Bad Request
Body
{
"error": {
"message": "Your code has expired. Sign in again and we'll send you a new code.",
"code": 81110,
"links": null,
"title": "Error"
}
}
Status: 200 OK
Body
{
"access_token": "28735RJZ0MG3378R8HV6946Y64D077930MZO29REK1RQ7493966107H64P7764AG",
"balance": 200.2,
"user": {
"username": "user",
"phone": "18558124430",
"first_name": "Random",
"last_name": "Name",
"display_name": "Random Name",
"profile_picture_url": "https://s3.amazonaws.com/venmo/no-image.gif",
"id": "3020735175772533188",
"email": "random@email.com"
}
}
Closed endpoints require a valid Authorization Token to be included in the header of the request. A Token can be acquired from the Login view above.
Revoke your Access Token.
DELETE
/oauth/access_token
Header
Key | Example Value | Required |
---|---|---|
Authorization | Bearer 28735RJZ0MG3378R8HV6946Y64D077930MZO29REK1RQ7493966107H64P7764AG | True |
Status: 401 Bad Request
Body
{
"error": {
"message": "Your OAuth Token has been revoked.",
"code": 262,
"links": null,
"title": "Error"
}
}
Status: 204 No Content
Your Token is revoked.
GET
/me
Header
Key | Example Value | Required |
---|---|---|
Authorization | Bearer 28735RJZ0MG3378R8HV6946Y64D077930MZO29REK1RQ7493966107H64P7764AG | True |
Status: 401 Bad Request
Body
{
"error": {
"message": "You did not pass a valid OAuth access token.",
"code": 261,
"links": null,
"title": "Error"
}
}
Status: 200 OK
Your user profile information.
{
"feature_groups": [],
"is_goods_services_limited": false,
"use_new_default_funding_source_logic": true,
"is_suspended_for_disputes": false,
"is_indebted": false,
"cip_status": "passed",
"is_balance_upgrade_user": false,
"available_instant_transfer_capabilities": [
"banks",
"cards"
],
"zendesk_identifier": "$$hjbvhjebvehjrbvehrjbvrehjvberhjvberh.ghfdjksghfdhjsghjfdkgyufgeryufbrefbreyubreyugregbreuygbreyugbreygbreyugbreyugberygergregreyugerygregregerghkjrhgulihgljkfdhgjghfjhgk.fghfverfgerlfbrehjkgbrebgerkgbrejkgbrehjgbe",
"notifications": {
"outgoing_count": {
"outgoing_requests_count": 0,
"outgoing_payments_count": 0
},
"incoming_count": 0
},
"qrc_rewards_enabled": true,
"user": {
"username": "JohnDoe",
"last_name": "Doe",
"friends_count": 100,
"is_group": false,
"is_active": true,
"trust_request": null,
"is_venmo_team": false,
"phone": "15551234567",
"profile_picture_url": "https://s3.amazonaws.com/venmo/no-image.gif",
"is_payable": true,
"is_blocked": false,
"id": "5611330498099736263",
"identity": {
"has_submitted": false
},
"date_joined": "2017-12-31T23:50:17",
"about": " ",
"display_name": "John Doe",
"identity_type": "personal",
"first_name": "John",
"friend_status": null,
"email": "john@doe.com"
},
"is_limited_account": false,
"is_web_whitelisted": false,
"needs_verification": "not_required",
"testing_bucket_id": "123",
"balance": "0.00",
"automatic_transfer_enabled": false,
"is_recovery_exempted": false
}
GET
/users/{user-id}
Header
Key | Example Value | Required |
---|---|---|
Authorization | Bearer 28735RJZ0MG3378R8HV6946Y64D077930MZO29REK1RQ7493966107H64P7764AG | True |
Status: 401 Bad Request
Body
{
"error": {
"message": "You did not pass a valid OAuth access token.",
"code": 261,
"links": null,
"title": "Error"
}
}
Status: 200 OK
The user's profile information.
{
"username": "random-name",
"last_name": "Name",
"friends_count": null,
"is_group": false,
"is_active": true,
"trust_request": null,
"phone": null,
"profile_picture_url": "https://s3.amazonaws.com/venmo/no-image.gif",
"is_blocked": false,
"id": "5611330498099736263",
"identity": null,
"date_joined": "2017-12-31T23:50:17",
"about": " ",
"display_name": "Random Name",
"first_name": "Random",
"friend_status": "not_friend",
"email": null
}
Revoke your Access Token.
GET
users/{user-id}/friends?limit=1337
Header
Key | Example Value | Required |
---|---|---|
Authorization | Bearer 28735RJZ0MG3378R8HV6946Y64D077930MZO29REK1RQ7493966107H64P7764AG | True |
Parameters
Key | Example Value | Description |
---|---|---|
limit= | 1337 | Max number of profile in every request is 1337 |
offset= | 1337 | How many friends to offset. Can be used for paging. |
Status: 401 Bad Request
Body
{
"error": {
"message": "You did not pass a valid OAuth access token.",
"code": 261,
"links": null,
"title": "Error"
}
}
Status: 200 OK
A list of all the friend's profile info of the provided user.
{
"pagination": {
"previous": null,
"next": "https://api.venmo.com/v1/users/{user-id}/friends?limit=1337&offset=1337"
},
"data": [
{
"username": "random-name",
"last_name": "Name",
"friends_count": null,
"is_group": false,
"is_active": true,
"trust_request": null,
"phone": null,
"profile_picture_url": "https://s3.amazonaws.com/venmo/no-image.gif",
"is_blocked": false,
"id": "5611330498099736263",
"identity": null,
"date_joined": "2017-12-31T23:50:17",
"about": " ",
"display_name": "Random Name",
"first_name": "Random",
"friend_status": "not_friend",
"email": null
}
]
}
GET
/stories/{transaction-id}
Header
Key | Example Value | Required |
---|---|---|
Authorization | Bearer 28735RJZ0MG3378R8HV6946Y64D077930MZO29REK1RQ7493966107H64P7764AG | True |
Status: 401 Bad Request
Body
{
"error": {
"message": "You did not pass a valid OAuth access token.",
"code": 261,
"links": null,
"title": "Error"
}
}
Status: 200 OK
All the information about a transaction that can be find.
{
"date_updated": "2018-12-27T17:30:48",
"transfer": null,
"app": {
"description": "Venmo for iPhone",
"site_url": null,
"image_url": "https://venmo.s3.amazonaws.com/oauth/no-image-100x100.png",
"id": 1,
"name": "Venmo for iPhone"
},
"comments": {
"count": 0,
"data": []
},
"payment": {
"status": "settled",
"id": 8579358424347419121,
"date_authorized": null,
"merchant_split_purchase": null,
"date_completed": "2018-12-27T17:02:40",
"target": {
"merchant": null,
"redeemable_target": null,
"phone": null,
"user": {
"username": "random-name",
"last_name": "Name",
"friends_count": null,
"is_group": false,
"is_active": true,
"trust_request": null,
"phone": null,
"profile_picture_url": "no-pic",
"is_blocked": false,
"id": "6088917218694187751",
"identity": null,
"date_joined": "2015-11-03T18:20:58",
"about": " ",
"display_name": "Random Name",
"first_name": "Random",
"friend_status": "not_friend",
"email": null
},
"type": "user",
"email": null
},
"audience": "public",
"actor": {
"username": "random-name2",
"last_name": "Name2",
"friends_count": null,
"is_group": false,
"is_active": true,
"trust_request": null,
"phone": null,
"profile_picture_url": "no-pic",
"is_blocked": false,
"id": "6088917218694187752",
"identity": null,
"date_joined": "2015-11-03T18:20:58",
"about": " ",
"display_name": "Random Name2",
"first_name": "Random",
"friend_status": "not_friend",
"email": null
},
"note": "Dude here is your money",
"amount": null,
"action": "pay",
"date_created": "2016-11-27T10:09:31",
"date_reminded": null
},
"note": "Dude here is your money",
"audience": "public",
"likes": {
"count": 1,
"data": [
{
"username": "random-name2",
"last_name": "Name2",
"friends_count": null,
"is_group": false,
"is_active": true,
"trust_request": null,
"phone": null,
"profile_picture_url": "no-pic",
"is_blocked": false,
"id": "6088917218694187752",
"identity": null,
"date_joined": "2015-11-03T18:20:58",
"about": " ",
"display_name": "Random Name2",
"first_name": "Random",
"friend_status": "not_friend",
"email": null
}
]
},
"mentions": {
"count": 0,
"data": []
},
"date_created": "2018-12-27T17:30:48",
"type": "payment",
"id": "5296429055819060535",
"authorization": null
}
Revoke your Access Token.
GET
/stories/target-or-actor/{user-id}
Header
Key | Example Value | Required |
---|---|---|
Authorization | Bearer 28735RJZ0MG3378R8HV6946Y64D077930MZO29REK1RQ7493966107H64P7764AG | True |
Parameters
Key | Example Value | Description |
---|---|---|
before_id={transaction-id} | 6088917218694187751 | List of transactions before the provided transaction-id. |
limit= | 50 | Max number of transactions per request is 50. |
Status: 401 Bad Request
Body
{
"error": {
"message": "You did not pass a valid OAuth access token.",
"code": 261,
"links": null,
"title": "Error"
}
}
Status: 200 OK
A list of all the user's transactions. Max 50 per request.
{
"pagination": {
"previous": "https://api.venmo.com/v1/stories/target-or-actor/{user-id}?limit=1&after_id={transaction-id}",
"next": "https://api.venmo.com/v1/stories/target-or-actor/{user-id}?before_id=transaction-id&limit=50"
},
"data": [
{
"date_updated": "2018-12-27T17:30:48",
"transfer": null,
"app": {
"description": "Venmo for iPhone",
"site_url": null,
"image_url": "https://venmo.s3.amazonaws.com/oauth/no-image-100x100.png",
"id": 1,
"name": "Venmo for iPhone"
},
"comments": {
"count": 0,
"data": []
},
"payment": {
"status": "settled",
"id": 1513921002697097045,
"date_authorized": null,
"merchant_split_purchase": null,
"date_completed": "2018-12-27T17:02:40",
"target": {
"merchant": null,
"redeemable_target": null,
"phone": null,
"user": {
"username": "random-name",
"last_name": "Name",
"friends_count": null,
"is_group": false,
"is_active": true,
"trust_request": null,
"phone": null,
"profile_picture_url": "no-pic",
"is_blocked": false,
"id": "6088917218694187751",
"identity": null,
"date_joined": "2015-11-03T18:20:58",
"about": " ",
"display_name": "Random Name",
"first_name": "Random",
"friend_status": "not_friend",
"email": null
},
"type": "user",
"email": null
},
"audience": "public",
"actor": {
"username": "random-name2",
"last_name": "Name2",
"friends_count": null,
"is_group": false,
"is_active": true,
"trust_request": null,
"phone": null,
"profile_picture_url": "no-pic",
"is_blocked": false,
"id": "6088917218694187752",
"identity": null,
"date_joined": "2015-11-03T18:20:58",
"about": " ",
"display_name": "Random Name2",
"first_name": "Random",
"friend_status": "not_friend",
"email": null
},
"note": "Dude here is your money",
"amount": null,
"action": "pay",
"date_created": "2016-11-27T10:09:31",
"date_reminded": null
},
"note": "Dude here is your money",
"audience": "public",
"likes": {
"count": 1,
"data": [
{
"username": "random-name2",
"last_name": "Name2",
"friends_count": null,
"is_group": false,
"is_active": true,
"trust_request": null,
"phone": null,
"profile_picture_url": "no-pic",
"is_blocked": false,
"id": "6088917218694187752",
"identity": null,
"date_joined": "2015-11-03T18:20:58",
"about": " ",
"display_name": "Random Name2",
"first_name": "Random",
"friend_status": "not_friend",
"email": null
}
]
},
"mentions": {
"count": 0,
"data": []
},
"date_created": "2018-12-27T17:30:48",
"type": "payment",
"id": "5296429055819060535",
"authorization": null
}
]
}
GET
/payment-methods
Header
Key | Example Value | Required |
---|---|---|
Authorization | Bearer 28735RJZ0MG3378R8HV6946Y64D077930MZO29REK1RQ7493966107H64P7764AG | True |
Status: 401 Bad Request
Body
{
"error": {
"message": "You did not pass a valid OAuth access token.",
"code": 261,
"links": null,
"title": "Error"
}
}
Status: 200 OK
A list of all the available payment methods.
{
"data": [
{
"top_up_role": "none",
"default_transfer_destination": "none",
"fee": null,
"last_four": null,
"id": "1208112335595142453",
"card": null,
"assets": null,
"peer_payment_role": "default",
"name": "Venmo balance",
"image_url": null,
"bank_account": null,
"merchant_payment_role": "none",
"type": "balance"
},
{
"top_up_role": "eligible",
"default_transfer_destination": "default",
"fee": null,
"last_four": "1234",
"id": "7239467018896641105",
"card": null,
"assets": {
"detail": "bank logo.jpg",
"thumbnail": "bank logo.jpg"
},
"peer_payment_role": "backup",
"name": "Capital One, Personal Checking",
"image_url": "/static/images/banklogos/capitalone.png",
"bank_account": {
"is_verified": true,
"id": "6203910C-50R3-78D0-844A-86R44J031368",
"bank": {
"asset_name": "capital_one",
"name": "Capital One"
}
},
"merchant_payment_role": "backup",
"type": "bank"
}
]
}
In the request body, if the amount is positive, then you are sending the money. If you simply take the amount value to be negative, then you are requesting for money.
POST
/payments
Header
Key | Example Value | Required |
---|---|---|
Authorization | Bearer 28735RJZ0MG3378R8HV6946Y64D077930MZO29REK1RQ7493966107H64P7764AG | True |
Content-Type | application/json | True |
Body, Sending money
{
"funding_source_id": 1208112335595142453,
"metadata": {
"quasi_cash_disclaimer_viewed": false
},
"user_id": 4696228937479104362,
"audience": "private",
"amount": 20,
"note": "The transaction note. Like, Last night's dinner."
}
Body, Requesting Money
{
"note": "The transaction note.",
"metadata": {
"quasi_cash_disclaimer_viewed": false
},
"amount": -18,
"user_id": 4696228937479104362,
"audience": "private"
}
Status: 401 Bad Request
Body
{
"error": {
"message": "You did not pass a valid OAuth access token.",
"code": 261,
"links": null,
"title": "Error"
}
}
Status: 200 OK
An example of making a charge request's response:
{
"data": {
"balance": "122.96",
"payment": {
"status": "pending",
"refund": null,
"medium": "Venmo for iPhone",
"id": "9252187857987647599",
"date_authorized": null,
"fee": null,
"date_completed": null,
"target": {
"merchant": null,
"redeemable_target": null,
"phone": null,
"user": {
"username": "random-name",
"last_name": "Name",
"friends_count": 1000,
"is_group": false,
"is_active": true,
"trust_request": null,
"phone": null,
"profile_picture_url": "https://s3.amazonaws.com/venmo/no-image.gif",
"is_blocked": false,
"id": "1357434613619042959",
"identity": null,
"date_joined": "2018-10-19T13:45:21",
"about": " ",
"display_name": "Random Name",
"first_name": "Random",
"friend_status": null,
"email": null
},
"type": "user",
"email": null
},
"audience": "private",
"actor": {
"username": "random-name",
"last_name": "Name",
"friends_count": 1000,
"is_group": false,
"is_active": true,
"trust_request": null,
"phone": null,
"profile_picture_url": "https://s3.amazonaws.com/venmo/no-image.gif",
"is_blocked": false,
"id": "1357434613619042959",
"identity": null,
"date_joined": "2018-10-19T13:45:21",
"about": " ",
"display_name": "Random Name",
"first_name": "Random",
"friend_status": null,
"email": null
},
"note": "the charge note",
"amount": 2.0,
"action": "charge",
"date_created": "2018-11-17T07:07:57",
"date_reminded": null
},
"payment_token": null
}
}