Find or create a payee

Resolves who you want to pay to a payee with a walletId, without
paying them yet. A disbursement destination does the same thing
inline, so this call is optional: use it to invite someone ahead of
their first payment.

  • A person, by emailAddress and/or mobileNumber. If they
    already have PayKeeper you get their existing wallet (200,
    resolution: EXISTING); if not, PayKeeper creates them (201,
    resolution: CREATED), with name required. Money can land in
    their wallet before they onboard. Add their ssn if you have it.
  • A company, by organizationName and the emailAddress of the
    contact who will set it up (plus ein if you have it). A company
    already on PayKeeper with that EIN is paid into its own wallet.
    Otherwise PayKeeper holds its money under its name until the
    contact finishes onboarding the company, then moves it into the
    company's own wallet. The same company named again (by EIN, or by
    contact and name) is the same payee.
  • A company already on PayKeeper, by organizationId.

While a payee has not claimed their account, onboardingUrl is the
link that lets them. It is returned on every read until they claim,
and reissued automatically on your next call if it lapses (people's
links last 14 days, companies' 45). For a new person, notify: true also
has PayKeeper send it; by default (notify: false) nothing is sent. Company invitations are never sent by PayKeeper:
put the link in your own email.

Giving both an email address and a mobile number that belong to two
different people is refused rather than guessed at.

An email address or mobile number is one person. When someone
already has the one you send, name must be theirs: the same family
name and first name, where a short form such as Ben for Benjamin is
fine. Anything else is 409 name_mismatch and nothing is paid, so an
address several of your participants share (a business manager's,
say) can stand for only one of them. Give each person their own email
or mobile number, or pay a company when the money is owed to one: a
loan-out, an estate or a trust is a company payee, not a person. The
dependable pattern is to resolve each participant once here with your
own id as externalId, then pay them by payeeId.

A payee shows only what you have told PayKeeper. Its name,
emailAddress and mobileNumber are the ones you gave, never the
details PayKeeper holds for the person, so resolving someone by email
does not reveal their mobile number or name.

Tax ids are optional. A person takes an ssn and a company an
ein; neither is needed to be paid. PayKeeper stores an SSN only
encrypted, keeps it out of its logs and never returns it: the payee
shows ssnLast4 (a company, einLast4). An SSN for someone who
already has a different one on file with you is refused, not
replaced.

StatuscodeWhen
400missing_contactNobody is named: no email, mobile number, company or organization id.
400payee_name_requiredThe person is new to PayKeeper and no name was given.
400missing_fieldA company has no contact emailAddress, or an ein came without an organizationName (a person has an ssn, not an ein).
400invalid_fieldA field is the wrong type or too long, emailAddress is not an email address, an ein or ssn is not nine digits (or an impossible SSN, such as area 000), a company was given a mobileNumber or an ssn, or metadata breaks its limits.
400ambiguous_payeeorganizationId came with other payee fields.
400invalid_bodyThe body is not a JSON object.
400invalid_idempotency_keyThe Idempotency-Key is longer than 255 characters, is not printable ASCII, or was sent twice.
404organization_not_foundorganizationId is not an organization on PayKeeper.
409contact_mismatchThe email address and mobile number belong to two different people.
409ssn_mismatchYou gave this person a different ssn before.
409name_mismatchThe email address or mobile number belongs to someone else: the family name or first name in name is not theirs.
409ein_name_mismatchThe ein belongs to a company with a different name.
409payee_external_id_mismatchThis payee already has a different externalId; a payee has one.
409external_id_already_existsAnother of your payees, or another of your objects, has this externalId. Nothing is created.
409external_id_busyAnother request with this externalId is being processed. Nothing is created; send it again in a moment.
409payee_busyAnother request is setting up the same new person right now. Nothing was created; send it again after Retry-After seconds.
409idempotency_key_in_useA request with this Idempotency-Key is still running. Send it again after Retry-After seconds.
422invalid_mobile_numbermobileNumber is not a valid mobile number.
422payee_not_createdPayKeeper could not create the person.
422ssn_not_acceptedThis environment cannot store an SSN yet. Leave ssn out.
422idempotency_key_reusedThis Idempotency-Key was already used for a different request. Use a new key.
503upstream_busyPayKeeper's banking provider asked it to slow down. Send it again after Retry-After seconds, with the same Idempotency-Key.
Recent Requests
Log in to see full request history
TimeStatusUser Agent
Retrieving recent requests…
LoadingLoading…
Body Params
Headers
string
length between 1 and 255

Optional here, and just as safe to send: a key you generate for this request (a UUID is best) and send again only to retry it, with the same body. Up to 255 printable ASCII characters. See Retries in the introduction.

Responses

Language
Credentials
Basic
base64
:
URL
LoadingLoading…
Response
Click Try It! to start a request and see the response here! Or choose an example:
application/json