This page is outdated and is kept for the sake of legacy. Please go to our developers portal for all the API documentation and examples.

Paxful API

Welcome to Paxful API. Here are some API endpoints that you can use in your existing apps and websites right now.

For Pay with Paxful and public data API endpoints read below. For user specific API endpoints visit our official documentation page.
API key and secret creation is done under your account settings.

Have any specific suggestions for API? Email us at [email protected]

Pay with paxful button

A simple button that makes it super easy for your users to pay with bitcoin, perfect for sites already accepting bitcoin. It saves them the trouble of copying and pasting bitcoin addresses and amounts and takes payment straight from their Paxful wallet making it easier for you to get paid!

Easy for newbies

Want mainstream users? Better make it easy! Our system is battle tested with the 2nd biggest classifieds ads site on the internet.

Mobile friendly

PAY WITH PAXFUL eliminates copying and pasting. You'd surprised how many can't copy and paste long bitcoin addresses or decimals, especially on mobile.

Instant bitcoin

Other ways to buy bitcoin take 4-6 days. With Paxful it's instant, which means more business for you.

Cut support in half

Doing 24/7 phone support for newbies taught us that sending bitcoin is even harder than buying it for most people. We fix that.

Earn on each sale Soon!

If your users need an easy way to buy bitcoins they can buy right off the button. You'll get 10x more than the current best affiliate program.

Super easy

Just paste a single line of html and you're up and running. Advanced merchants can also do secure integration.

In short - add wallet/pay?to=1NX5D8SnTn69KYzs17byCELfhXaHuL7zKu&amount=0.02 to your website where to query parameter is to which address user has to pay and amount is how much user needs to pay in bitcoins. Clicking on that link will open user's Paxful wallet dialog with prefilled bitcoin address and amount.
Read below how to secure the URL with API seal.

A proven WINNER

When the second biggest classifieds site on the internet lost their VISA and MasterCard accounts, Paxful was there to help them onboard their users. The PAY WITH PAXFUL button increased their conversions several fold.

We can work with you and make a special landing page on Paxful for your business where Paxful non-logged in users will be redirected. Please take a look at BackPage's landing page.

Api requirements

Following requirements are needed to integrate PAY WITH PAXFUL button into your website.

API-key and API-secret can be created under your Paxful account settings. Treat your API-secret as passwords, don't store it in plain. For example keep it encrypted in your database.

You have to pass POST or GET request with following parameters

apikey
nonce
to
amount
apiseal

Example

apikey=6bSxoS3gd2vdO458EU0UZANWyiMmKnyo
&nonce=1386178459
&to=1CkSCqyWGtVjok5A5xeGKKyMvpeZMnfEbq
&amount=0.5
&apiseal=f950b3241ce3fb1a4664c59d60c5ac470ca3793e

Reference

apikey (type: char, length: 32): client designated API-key (unique)
apiseal (type: char, length: 40): signature (digest) of the request params passed through a HMAC-SHA256 construct
nonce (type: char): a random integer that must be incremented in every request (common practice to use Unix time)
to (type: char): your website's bitcoin address where user has to send payment
amount (type: number): bitcoin amount how much user has to pay

API seal creation

The process of calculating the required apiseal parameter involves using a HMAC-SHA256 construct. The result is a digest, which in turn serves as a MAC for server-side validation in regards to data integrity and authenticity. You would need to concatenate all request parameters (i.e., apikey, nonce, to, amount) that are passed to the server when making a request, except for the apiseal parameter itself. The provided API-secret is used as the corresponding secret cryptographic key. Example apikey=6bSxoS3gd2vdO458EU0UZANWyiMmKnyo&nonce=1386178459&to=1CkSCqyWGtVjok5A5xeGKKyMvpeZMnfEbq&amount=0.5
Passing this string with secret to your HMAC function will return API-seal that you pass to the PAY WITH PAXFUL URL.

Simulation

echo -n "apikey=6bSxoS3gd2vdO458EU0UZANWyiMmKnyo&nonce=1386178459&to=1CkSCqyWGtVjok5A5xeGKKyMvpeZMnfEbq&amount=0.5" | openssl dgst -sha256 -hmac 98276117589486d823930f29dd0b8f3e
(stdin)= e81ca851d16b12b2fc534aa58e1d7043b1711062

Note that the query string has to be in the exact order specified above since on our end we are recreating your passed API-seal and verifying that it matches the one you have passed in request.

Sample link

https://paxful.com/wallet/pay?apikey=6bSxoS3gd2vdO458EU0UZANWyiMmKnyo&nonce=1386178459&to=1CkSCqyWGtVjok5A5xeGKKyMvpeZMnfEbq&amount=0.5&apiseal=e81ca851d16b12b2fc534aa58e1d7043b1711062

Successful request

If query string is correct the Paxful wallet page send out dialog will open for user with your specified bitcoin address and amount pre-filled and user has to make just 1 click - CONFIRM SEND

Unsuccessful request

While you are developing the button, in case of incorrect parameters or incorrect HMAC calculation clicking the link will open Paxful wallet page with detailed error message(s).

Offers public data in JSON format

Add ?format=json at the end of URL to get the data in JSON

Single offer public data

Append ?format=json to any offer's URL

https://paxful.com/offer/j4Exo7Vbe2v?format=json

And get following output

{
    "offer_id":"j4Exo7Vbe2v",
    "offer_type":"sell",
    "payment_window":60,
    "currency_code":"USD",
    "fiat_price_per_btc":"484.71",
    "fiat_USD_price_per_btc":"484.71",
    "fiat_amount_range_min":"1.00",
    "fiat_amount_range_max":"1500.00",
    "crypto_min":206308,
    "crypto_max":309463390,
    "offer_terms":"Offer terms html escaped and new lines are as \r\n",
    "payment_method_name":"Target Gift Card",
    "payment_method_slug":"target-gift-card",
    "offer_owner_username":"tolan77",
    "offer_owner_feedback_positive":1009,
    "offer_owner_feedback_negative":0,
    "last_seen":"seen-very-recently",
    "last_seen_timestamp":"1447727157", # UNIX timestamp or null if seen more than a week ago
    "require_verified_email":false,
    "require_verified_phone":false,
    "require_min_past_trades":null
}

crypto_min and crypto_max are in satoshis which is 1/100 000 000th of bitcoin and is updated every 10 minutes.

Browse offers public data

Append ?format=json to any /buy-bitcoin or /sell-bitcoin URL to get the data in JSON. Works with specific payment method URLs as well such as
/buy-bitcoin/paypal?format=json

https://paxful.com/buy-bitcoin?format=json

And get the following output

{
   "data":[
      {
         "offer_id":"nwzmv9zDoKR",
         "offer_link":"https:\/\/paxful.com\/offer\/nwzmv9zDoKR",
         "offer_type":"sell",
         "payment_window":180,
         "currency_code":"USD",
         "fiat_price_per_btc":"278.52",
         "fiat_USD_price_per_btc":"278.52",
         "fiat_amount_range_min":"100.00",
         "fiat_amount_range_max":241,
         "crypto_min":35904064,
         "crypto_max":"85965637",
         "payment_method_name":"Interac e-transfer",
         "payment_method_slug":"interac-e-transfer",
         "offer_owner_username":"Dayclone",
         "offer_owner_profile_link":"https:\/\/paxful.com\/user\/Dayclone",
         "offer_owner_feedback_positive":1,
         "offer_owner_feedback_negative":0,
         "offer_owner_country_iso":"CA",
         "last_seen":"seen-very-recently",
         "last_seen_timestamp":"1447727157", # UNIX timestamp or null if seen more than a week ago
         "require_verified_email":false,
         "require_verified_phone":false,
         "require_min_past_trades":null
      },
            ...
      {
         "offer_id":"dg7oQ3vN1vX",
         "offer_link":"https:\/\/paxful.com\/offer\/dg7oQ3vN1vX",
         "offer_type":"sell",
         "payment_window":180,
         "currency_code":"USD",
         "fiat_price_per_btc":"1240.96",
         "fiat_USD_price_per_btc":"1240.96",
         "fiat_amount_range_min":"20.00",
         "fiat_amount_range_max":133,
         "crypto_min":1611655,
         "crypto_max":"10635531",
         "payment_method_name":"Amazon E Gift Card",
         "payment_method_slug":"amazon-e-gift-card",
         "offer_owner_username":"kobeBTC1",
         "offer_owner_profile_link":"https:\/\/paxful.com\/user\/kobeBTC1",
         "offer_owner_feedback_positive":5,
         "offer_owner_feedback_negative":0,
         "offer_owner_country_iso":null,
         "last_seen":"seen-long-ago",
         "last_seen_timestamp":null,
         "require_verified_email":false,
         "require_verified_phone":false,
         "require_min_past_trades":null
      }
   ],
   "count":2
}

All offers are in data array and count is how many offers are in output.
offer_owner_country_iso 2 letter ISO country code that is optional attribute which offer owner can add. It is just for information purposes when offer owner wants to highlight that his offer is targeted to some specific country. Offer is still visible to everybody in the world. In case no country was chosen, it is thennull.
seen-very-recently means that vendor was online less than 30 minutes ago.
seen-recently means vendor was online less tan 1 hour and 30 minutes ago.
seen-long-ago means vendor was online more than 1 hour and 30 minutes ago.

Trade history

https://paxful.com/data/trades returns all successfully completed trades

Always provide parameters in the URL to get correct set of trades. There is hard cap of 100 trades per request even if you specified bigger limit in your parameters. Trades completed within last 24 hours are never included because cancelled trades can still be re-opened within 24 hours and would only then go under completed trades. This insures your request will never miss a completed trade.

Append to URL any fiat currency code to get trades only for that specific currency. For example https://paxful.com/data/trades/USD or https://paxful.com/data/trades/EUR

Parameters

https://paxful.com/data/trades?since=500 - Trade ID or Unix timestamp depending on what is passed to sincetype parameter.
https://paxful.com/data/trades?sincetype=date&since=1447733179 - Default id. Alternatively use date which takes Unix timestamp in since parameter.
https://paxful.com/data/trades?limit=20 - Default 100. Limit number of trades returned. Maximum hard cap is 100.

Response

[
    {
        "id":420, # Trade ID
        "date":"1435428778", # Unix timestamp
        "amount":"1.10324132", # Amount of BTC traded
        "price":"500.00", # Price per 1 bitcoin
        "payment_method":"Paypal My Cash",
        "payment_method_group":"Gift cards",
        "currency":"USD",
        "type":"sell" # Indicates 'buy' or 'sell' trade
    },
    {
        "id":425,
        "date":"1435498191",
        "amount":"1.75106815",
        "price":"500.00",
        "payment_method":"Western Union",
        "payment_method_group":"Cash deposits",
        "currency":"USD",
        "type":"buy"
    },
    {
        "id":432,
        "date":"1435485454",
        "amount":"0.17927704",
        "price":"49.00",
        "payment_method":"Paypal",
        "payment_method_group":"Online transfers",
        "currency":"EUR",
        "type":"buy"
    }
]
                    

Notice the payment methods and groups may change over time since we are always adjusting them for better buying experience.

Partners using the Paxful API