Pendencies API — Functional Documentation

This document describes the functional behavior of the Pendencies API from the perspective of a partner integrating with it. It explains what the API does, the onboarding flow it supports, the pendencies a merchant may have, and the business rules that govern each operation.

Table of contents


Overview

The Pendencies API lets partners query and resolve the onboarding pendencies of a Getnet merchant. A pendency is an outstanding requirement (missing data, a document, or an acceptance) that the merchant must satisfy before affiliation can proceed.

Using this API, a partner can:

  • Query a merchant's open pendencies and their current status.
  • Submit or update registration data.
  • Request and validate contact-channel verification codes (SMS / email / WhatsApp).
  • Upload required documents (as Base64 content).
  • Accept documents and terms.
  • Download generated documents when available.
All requests and responses use JSON in snake_case, dates are ISO-8601 UTC, and the content type is application/json.

Actors and context

Every operation runs in the context of a partner acting on behalf of a merchant.
FieldDescription
partnerIdUnique identifier of the partner application.
merchantIdIdentifier of the merchant whose onboarding is being managed.

Both identifiers appear in the path of every endpoint:

text
/api/v1/partner/{partnerId}/merchant/{merchantId}/pendencies
A person type is derived from the merchant's legal document and returned as person_type:
  • natural_person — the merchant's legal document is a CPF (individual).
  • company — the merchant's legal document is a CNPJ (legal entity).

The person type determines which registration attributes apply (see data_grid attribute catalog).


Supported pendencies

Only the pendencies below are exposed to partners. Any other pendency the platform tracks internally is never returned.

PendencyMeaningResolved via
cell_phone_validationCell phone ownership must be verifiedtoken request + validation
email_validationEmail ownership must be verifiedtoken request + validation
data_gridRegistration attributes must be provided/updatedPUT /data-grid
selfie_uploadSelfie must be uploadedPOST /upload-document
identification_document_uploadIdentification document must be uploadedPOST /upload-document
social_contract_uploadSocial contract must be uploadedPOST /upload-document
letter_of_attorney_uploadPower of attorney must be uploadedPOST /upload-document
order_summaryOrder summary must be acceptedPUT /acceptance-document
terms_and_conditionsTerms and conditions must be acceptedPUT /acceptance-document
privacy_policyPrivacy policy must be acceptedPUT /acceptance-document
A merchant with no open pendencies returns an empty list (pendencies: []).
When a data_grid pendency is returned and it is pending, its grid_info field lists exactly which registration attributes must be submitted.
When a cell_phone_validation / email_validation pendency is returned, its data field carries the masked contact value the verification code will be sent to, so the partner can show the merchant which channel is going to be used.

End-to-end onboarding flow

A partner first queries the merchant's pendencies, then resolves each one respecting the ordering rules below. Only pendencies that are actually open for that merchant need to be resolved.

text
Query pendencies │ ▼ 1. Contact validation (first) ├─ Submit email / cell_phone via data_grid → 600;">PUT .../data-grid │ (the value must exist before a code can be sent to it) └─ Request and validate the code → 600;">POST .../token-request?type= → 600;">POST .../token-validation?type= │ ▼ 2. Resolve remaining registration data (data_grid) → 600;">PUT .../data-grid │ ▼ 3. Documents → 600;">POST .../upload-document ├─ Selfie, then identification document (only after the selfie, when required) └─ Social contract or power of attorney (per the merchant's case) │ ▼ 4. Accept documents and terms → 600;">PUT .../acceptance-document │ ▼ Onboarding completed
Ordering rules:
  • Contact validation comes first. The partner never sends the contact value to the token endpoints: the API reads it from the merchant's email_validation / cell_phone_validation pendency. Therefore the matching email / cell_phone value must already exist in the registration (submitted via data_grid); otherwise the token request is rejected with 422.
  • Identification document after the selfie, when the selfie is required.
  • Social contract before power of attorney. The merchant provides the social contract or the power of attorney depending on their situation.

Operations

Base path: /api/v1/partner/{partnerId}/merchant/{merchantId}/pendencies
Interactive docs are available at /swagger-ui.html; the OpenAPI spec at /api-docs.
MethodRouteSuccess
GET(base path)200
POST/token-request?type=202
POST/token-validation?type=200
PUT/data-grid204
POST/upload-document200
PUT/acceptance-document200
GET/download-document/{documentType}200

1. Query pendencies

GET (base path)
Returns the merchant's pendencies with their current status and last-update timestamp, plus the merchant's person_type and overall situations.
json
{ "person_type": "natural_person", "situations": [ { "status": "active", "status_update_date": "2026-07-02T20:08:04.155Z" } ], "pendencies": [ { "pendency_type": "email_validation", "situation": { "status": "pending", "status_update_date": "2026-07-02T20:08:04.155Z" }, "data": { "type": "email", "value": "t***@email.com" } }, { "pendency_type": "data_grid", "situation": { "status": "pending", "status_update_date": "2026-07-02T20:08:04.155Z" }, "grid_info": [ { "attribute": "email", "required": true }, { "attribute": "residential_address", "required": true } ] } ] }

Response fields:

FieldDescription
person_typenatural_person or company, derived from the merchant's legal document.
situations[]Overall situation of the merchant (status + status_update_date).
pendencies[].pendency_typeThe pendency identifier (see supported pendencies).
pendencies[].situationstatus + status_update_date (ISO-8601 UTC).
pendencies[].grid_info[]Only for data_grid when the pendency is pending: the attributes to submit, each with attribute and required.
pendencies[].dataOnly for email_validation / cell_phone_validation: { "type": "email" | "cell_phone", "value": "<masked>" }.

Notes:

  • The merchant's legal document number is not returned.
  • Omitted (null) fields are not serialized.
  • Merchant not found / not accessible → 404.
  • No applicable pendencies → 200 with an empty list.
situation.status values: active, inactive, created, success, failure, retry, approved, pending, received, reopened, dismissed, dismiss_analysis, reproved, finished, analysis, canceled.
Success: 200

2. Request validation code

POST /token-request?type={channel}
Requests a one-time verification code to be sent to the merchant through a contact channel. There is no request body.
ParameterInRequiredDescription
typequeryyesContact channel: cell_phone, email or whatsapp (case-insensitive).
The contact value is not supplied by the partner: it is read from the merchant's matching pendency (email_validation for email, cell_phone_validation for cell_phone / whatsapp). If no contact value is available there, the request fails with 422.
The code is dispatched asynchronously to the merchant. The response echoes the token session with the contact channels masked:
json
{ "sms_token_validation_id": "b1e3...", "cell_phone": "(51) 9****-7923", "acquirer_merchant_code": "123456", "situation": { "status": "pending" } }
situation.status for the token session is pending or ok.
Success: 202 (accepted / dispatched)

3. Validate code

POST /token-validation?type={channel}

Submits the code the merchant received to confirm ownership of the contact channel.

ParameterInRequiredDescription
typequeryyesContact channel: cell_phone, email or whatsapp.

Body:

FieldRequiredDescription
tokenyesThe one-time code received by the merchant.
device_fingerprintnoDevice fingerprint for fraud prevention.
json
{ "token": "654321", "device_fingerprint": "abc123" }
As in the token request, the contact value is fetched from the merchant's pendencies; the partner never sends it. Contact channels in the response are masked. Unlike the other write operations, this body tolerates extra fields: anything other than token and device_fingerprint is ignored.
Success: 200 (channel ownership confirmed)

4. Resolve data_grid

PUT /data-grid
Submits registration attributes to resolve the data_grid pendency. The body carries a pendencies envelope; only data_grid is accepted, and each grid_info item is discriminated by its attribute:
json
{ "pendencies": [ { "name": "data_grid", "grid_info": [ { "attribute": "email", "email": "teste@email.com" }, { "attribute": "cell_phone", "cell_phone": "51992547923" } ] } ] }
  • pendencies and grid_info must not be empty; name must be exactly data_grid.
  • The merchant must have an active data_grid pendency (status pending); otherwise the request is rejected with 422.
  • Only attributes in the attribute catalog are accepted; any other attribute, an unknown field, an empty body, or a malformed value → 400.
Success: 204 (no content)

5. Upload document

POST /upload-document

Uploads a required document as Base64 content.

FieldRequiredDescription
document_typeyese.g. social_contract, identification_document, selfie.
sideyesImage side, e.g. front, back.
file_typeyesFile format, e.g. pdf, jpg, png.
file_base64yesBase64-encoded file content (must be valid Base64).
device_fingerprintnoDevice fingerprint.
Unknown fields are rejected with 400.

Response:

json
{ "storage_info": { "file_name": "799165-SOCIAL_CONTRACT-FRONT.PDF", "file_format": "PDF", "version": 1 }, "situation": { "status": "received", "status_update_date": "2026-07-02T20:08" } }
status_update_date is UTC truncated to the minute.
Re-sending a document that already exists in the contract is rejected with 422 ("The submitted document already exists in this contract.").
Success: 200

6. Accept document

PUT /acceptance-document

Accepts a document or terms. The body carries a pendencies envelope:

json
{ "pendencies": [ { "name": "privacy_policy", "device_fingerprint": "abc123", "situation": { "status": "finished" } } ] }
name and situation.status are required; device_fingerprint is optional. Unknown fields (including nested ones) are rejected with 400.

The response flattens the first accepted pendency:

json
{ "name": "order_summary", "file_name": "55074570-ORDER_SUMMARY.PDF", "status": "finished", "status_update_date": "2026-07-08T11:48" }
Success: 200

7. Download document

GET /download-document/{documentType}
Downloads a generated document as a Base64 string. documentType must be one of terms_and_conditions or order_summary; any other value → 400 (rejected before any downstream call).
json
{ "document_type": "terms_and_conditions", "file_base64": "JVBERi0xLjQ=" }
Success: 200

data_grid attribute catalog

When a data_grid pendency is returned, grid_info lists the attributes that must be submitted. The applicable set depends on the merchant's person type.

Natural Person (PF)

country_of_birth, cell_phone, email, gross_monthly_income, net_worth, residential_address, merchant_category_code, commercial_address, business_address

Company (PJ)

Company-level attributes merchant_category_code and business_address, plus the legal representative's data:
legal_representative.email, legal_representative.cell_phone, legal_representative.country_of_birth, legal_representative.residential_address, legal_representative.gross_monthly_income, legal_representative.net_worth

Value rules per attribute

AttributeValue shapeRule
email / legal_representative.emailemailValid email address, not blank.
cell_phone / legal_representative.cell_phonecell_phone10 to 13 digits.
country_of_birth / legal_representative.country_of_birthcountryISO 3166-1 alpha-2, uppercase (e.g. BR).
residential_address, business_address, commercial_address (and legal_representative.residential_address)addressSee address fields below.
merchant_category_codemerchant_category_code + economic_activity_classification_code, or acquirer_merchant_category_codeProvide the MCC pair (MCC = 4 digits, CNAE = 1–7 digits) or the acquirer MCC.
gross_monthly_income / legal_representative.gross_monthly_incomegross_monthly_incomeWhole integer amount in BRL (reais, not cents).
net_worth / legal_representative.net_worthnet_worthWhole integer amount in BRL (reais, not cents).
Address fields: street (required), number (blank is treated as "0"), district (required), city, state, postal_code (required, digits only), country (required, ISO alpha-2).

Example of an address item:

json
{ "attribute": "residential_address", "address": { "street": "RUA Y", "number": "200", "district": "MENINO DEUS", "city": "PORTO ALEGRE", "state": "RS", "postal_code": "90110000", "country": "BR" } }

Business rules and constraints

  • Only open pendencies can be resolved. Resolving data_grid requires an active (pending) data_grid pendency; otherwise 422.
  • Selective exposure. Only the supported pendencies are returned; internal pendency types are never exposed.
  • grid_info is only returned while the pendency is pending. Attributes outside the catalog are discarded; if a pending data_grid carries only unknown attributes, the API returns 500.
  • Strict input. Partner request bodies reject unknown fields (400) — the only exception is the token-validation body, which ignores them. Empty bodies ({} / []) are rejected, and a JSON object sent where an array is expected is also rejected.
  • Documents must contain valid Base64 content.
  • Contact validation ordering. The verification code is always sent to the value already stored in the registration for that channel; the partner cannot override it.
  • Person type is derived from the merchant's legal document: CPF → natural_person, CNPJ → company.
  • No open pendencies returns an empty list.
  • Anti-enumeration. An unknown or inaccessible merchant always results in 404, regardless of how the platform reports it internally.
  • Sensitive data must be transmitted over HTTPS, and all requests require authentication.

Data protection (masking)

Raw contact data is never returned to the partner:

WhereFieldExample
GET pendencies (email_validation)data.valueteste@email.comt***@email.com
GET pendencies (cell_phone_validation)data.value51992547923(51) 9****-7923
POST /token-request and POST /token-validationemail, cell_phonesame masking rules

Masking rules: e-mail keeps the first character of the local part and the whole domain; phone keeps the area code and the last four digits. Values that cannot be masked (malformed) are omitted.


Error meanings

HTTPMeaning
200Success
202Accepted (validation code dispatched)
204Success, no content returned
400Invalid request (malformed body, unknown field, invalid value, unsupported channel/document type)
401Missing or invalid authentication
403Authenticated caller not allowed to access the resource
404Merchant not found or not accessible by the partner (also returned for unknown routes)
422Business rule violation (e.g. no active data_grid pendency, no contact value to send a code to)
500Unexpected error, or a downstream service temporarily unavailable
504Request timed out

Error responses share a common shape:

json
{ "status_code": 422, "message": "No active data_grid pendency to resolve for this merchant.", "details": [] }
Validation errors list the offending fields in details[], in snake_case:
json
{ "status_code": 400, "message": "Validation failed for one or more fields.", "details": [ { "item": "pendencies[0].grid_info[0].email", "description": "email must be a valid email address" } ] }

Two variations exist for document flows:

  • upload-document, acceptance-document and download-document errors omit the empty details array, returning only status_code and message.
  • When the platform reports a field-level problem while accepting a document, the response is { "status_code": ..., "item": ..., "description": ... }.

Messages returned to the partner are always sanitized: internal identifiers, class names and downstream messages in Portuguese are never relayed.