Create a partner-level token

Credentials

Overview

For PayMe partners only. Saves a card as a token that belongs to your partner account, so you can charge it later for any of your sellers. A buyer saves a card while buying from one seller and can then pay another seller without typing it again. A seller-level token can't do that.

The MPL in the path (the seller_payme_id of one of your sellers) identifies your account; the call takes no other key. Treat the MPL as a secret: call this endpoint from your server only, never from a browser.

This endpoint takes raw card details, so call it only if you are PCI DSS certified. Without that certification, capture the same kind of token on a page PayMe hosts: send generate-sale with sale_type: "seller-token" and show the buyer its sale_url. PayMe sets the price of such a sale itself.

Using the token

The token is the uuid in the response. Send it as token on generate-sale, with the seller_payme_id of the seller you are charging for. It is not a buyer_key: sent as buyer_key, it fails with error 600. Against a seller of a different partner it fails with error 605.

The token is permanent: it doesn't expire in PayMe, and each charge with it runs at once, with no CVV and no 3D Secure. A charge can still fail if the card has expired or the issuer declines it.

The response isn't PayMe's usual envelope. A success has no status_code, so check for HTTP 201 and a uuid. A failure has the usual status_code: 1 and status_error_code; decide from those, not from the HTTP status.

A token is a bearer credential: store it encrypted, and never log it or send it to a browser. See Saved Cards for the rules.

This page covers credit-card, the method checked in the sandbox.

Parameters

Name In Type Required Description
mpl path string yes The seller_payme_id (MPL) of one of your sellers. It identifies your partner account, so keep it secret and send it from your server only. The token is stored under this seller and can be charged for your other sellers too.

Request body

Content type: application/json

Field Type Required Description
payment object yes The card to save.
payment.method string yes credit-card.
payment.card_number string yes Card number, digits only.
payment.card_expiry string yes Card expiry, MMYY.
payment.card_cvv string no CVV, 3 or 4 digits. Required unless options.use_token_terminal is true; missing, it returns error 1.
customer object yes The buyer.
customer.name string yes Buyer's full name. Missing: error 1.
customer.email string yes Buyer's email address. Missing or invalid: error 13.
customer.phone string yes Buyer's phone number. Missing: error 1.
customer.social_id string no Buyer's Israeli ID number. When sent, it must be a valid Israeli ID.
customer.zip_code string no Buyer's zip code.
customer.country string no Buyer's country, a two-letter code such as IL.
customer.state string no Buyer's state or region.
customer.city string no Buyer's city.
customer.line1 string no Buyer's street address.
customer.line2 string no Buyer's address, second line.
customer.business_code string no For a business buyer: its registration number. Send it with customer.business_name, or neither.
customer.business_name string no For a business buyer: its name. Send it with customer.business_code, or neither.
options object no Token options.
options.validate_token boolean no Check the card with the issuer before saving it. Default true.
options.use_token_terminal boolean no true to save the card without a CVV, on a token terminal. Then payment.card_cvv is optional. Default false.

Request example

{
  "payment": {
    "method": "credit-card",
    "card_number": "4557430402053431",
    "card_expiry": "1230",
    "card_cvv": "200"
  },
  "customer": {
    "name": "First Last",
    "email": "buyer@example.com",
    "phone": "+972501234567",
    "social_id": "008336174"
  }
}

Code samples

curl

curl -X POST 'https://sandbox.payme.io/api/sellers/<mpl>/tokens' \
  -H 'Content-Type: application/json' \
  --data-raw '{
  "payment": {
    "method": "credit-card",
    "card_number": "4557430402053431",
    "card_expiry": "1230",
    "card_cvv": "200"
  },
  "customer": {
    "name": "First Last",
    "email": "buyer@example.com",
    "phone": "+972501234567",
    "social_id": "008336174"
  }
}'

Node.js

const response = await fetch("https://sandbox.payme.io/api/sellers/<mpl>/tokens", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "payment": {
      "method": "credit-card",
      "card_number": "4557430402053431",
      "card_expiry": "1230",
      "card_cvv": "200"
    },
    "customer": {
      "name": "First Last",
      "email": "buyer@example.com",
      "phone": "+972501234567",
      "social_id": "008336174"
    }
  }),
});

console.log(await response.text());

Python

import requests

response = requests.post(
    "https://sandbox.payme.io/api/sellers/<mpl>/tokens",
    json={
        "payment": {
            "method": "credit-card",
            "card_number": "4557430402053431",
            "card_expiry": "1230",
            "card_cvv": "200",
        },
        "customer": {
            "name": "First Last",
            "email": "buyer@example.com",
            "phone": "+972501234567",
            "social_id": "008336174",
        },
    },
)

print(response.text)

PHP

<?php

$body = <<<'BODY'
{
  "payment": {
    "method": "credit-card",
    "card_number": "4557430402053431",
    "card_expiry": "1230",
    "card_cvv": "200"
  },
  "customer": {
    "name": "First Last",
    "email": "buyer@example.com",
    "phone": "+972501234567",
    "social_id": "008336174"
  }
}
BODY;

$ch = curl_init('https://sandbox.payme.io/api/sellers/<mpl>/tokens');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => $body,
]);

$response = curl_exec($ch);
curl_close($ch);

echo $response;

Responses

201 — The token was created (success)

Field Type Description
uuid string The token. Send it as token on generate-sale.
customer object name, email, phone and social_id
payment object display (the masked card number), expiry, brand, club, type, organization, origin_country and is_foreign
{
  "uuid": "00000000-0000-0000-0000-000000000000",
  "customer": {
    "name": "First Last",
    "email": "buyer@example.com",
    "phone": "+972501234567",
    "social_id": "008336174"
  },
  "payment": {
    "display": "455743******3431",
    "expiry": "1230",
    "brand": "Visa"
  }
}

400 — The card was declined or failed validation. Read status_code and status_error_code. (error)

Field Type Description
status_code integer 1: the request failed.
status_error_code integer PayMe's error code, such as 20004 for a declined card.
status_error_details string The error message.
status_additional_info string More detail, such as the masked card number.
{
  "status_code": 1,
  "status_error_code": 20004,
  "status_error_details": "Refusal by credit company. Please try a different card",
  "status_additional_info": "400000******0002"
}

500 — A required field is missing or invalid (error)

Field Type Description
status_code integer 1
status_error_code integer 1 for a missing field (customer.name, customer.phone, payment.card_cvv and so on), named in status_additional_info. 13 for a missing or invalid email.
status_error_details string The error message
status_additional_info string The field at fault, when there is one
{
  "status_code": 1,
  "status_error_code": 1,
  "status_error_details": "Required parameter is missing",
  "status_additional_info": "payment.card_cvv"
}