Stable Pro

Stable Pro API · v1

Endpoints y objetos

Cada endpoint con su permiso, sus parámetros y su respuesta, y cada objeto con sus campos. Generado a partir del contrato OpenAPI.

Los nombres de los campos, los códigos y los valores son el contrato: son iguales en todos los idiomas. Las descripciones están traducidas.

Endpoints

GET/api/v1/connection

La conexión de la clave que llama: nombre, permisos y la propia clave (nunca el secreto)

Permiso
cualquier clave válida
Parámetros
lang
Respuesta
Connection
Errores
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/codes

El diccionario de todos los códigos que devuelve la API, con los nombres en el idioma solicitado (?lang=, Accept-Language)

Permiso
cualquier clave válida
Parámetros
lang
Respuesta
Codes
Errores
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/organization

La cuadra de la clave que llama: nombre, país, moneda, zona horaria, idioma, si Stable Pro calcula los impuestos

Permiso
cualquier clave válida
Parámetros
lang
Respuesta
Organization
Errores
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/customers

Todos los que tienen al menos un cargo, pagado o no, socio o personal; con customers.fiscal:read también los datos de facturación

Permiso
customers:read
Parámetros
langlimitstarting_after
Respuesta
CustomerList
Errores
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/customers/{id}

Un cliente; con customers.fiscal:read también los datos de facturación. De otra cuadra: 404

Permiso
customers:read
Parámetros
id (en la ruta)lang
Respuesta
Customer
Errores
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/customers/{id}/balance

Lo que el cliente debe hoy, lo que llega después y el crédito que puede usar

Permiso
charges:read
Parámetros
id (en la ruta)lang
Respuesta
Balance
Errores
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/charges

Todos los cargos a los clientes, pagados o no (nunca los pagos al personal)

Permiso
charges:read
Parámetros
langlimitstarting_after
Filtros
  • customer — Solo este cliente (su id)
  • accounting_month — Solo este mes contable (YYYY-MM): el mes en que cuenta el hecho, consulta Convenciones
Respuesta
ChargeList
Errores
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/charges/{id}

Un cargo, tal como es ahora: importe e impuestos son el origen más las correcciones más los cambios de impuesto

Permiso
charges:read
Parámetros
id (en la ruta)lang
Respuesta
Charge
Errores
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/adjustments

Correcciones de cargos

Permiso
charges:read
Parámetros
langlimitstarting_after
Filtros
  • charge — Solo las correcciones de este cargo (su id)
  • accounting_month — Solo este mes contable (YYYY-MM): el mes en que cuenta el hecho, consulta Convenciones
Respuesta
AdjustmentList
Errores
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/adjustments/{id}

Una corrección: action, reason, category, importe con signo, consideration_effect, la diferencia de impuesto

Permiso
charges:read
Parámetros
id (en la ruta)lang
Respuesta
Adjustment
Errores
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/payments

Movimientos de dinero de los clientes (cobros, reembolsos, anulaciones, crédito usado)

Permiso
payments:read
Parámetros
langlimitstarting_after
Filtros
  • customer — Solo este cliente (su id)
Respuesta
PaymentList
Errores
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/payments/{id}

Un movimiento de dinero, con sus asignaciones; quién pagó por cuenta del cliente

Permiso
payments:read
Parámetros
id (en la ruta)lang
Respuesta
Payment
Errores
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/allocations/{id}

Cuánto de un movimiento va a un cargo, con signo

Permiso
payments:read
Parámetros
id (en la ruta)lang
Respuesta
Allocation
Errores
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/credit-entries

Movimientos del crédito de los clientes (creado, aumentado, usado, reembolsado)

Permiso
payments:read
Parámetros
langlimitstarting_after
Filtros
  • customer — Solo este cliente (su id)
Respuesta
CreditEntryList
Errores
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/credit-entries/{id}

Un movimiento del crédito de un cliente

Permiso
payments:read
Parámetros
id (en la ruta)lang
Respuesta
CreditEntry
Errores
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/receipts

Recibos de Stable Pro (R: recibos de pago, RB: confirmaciones de reembolso), en orden de emisión; nunca documentos fiscales

Permiso
receipts:read
Parámetros
langlimitstarting_after
Filtros
  • customer — Solo este cliente (su id)
  • payment — Solo los recibos de este movimiento de dinero (su id)
Respuesta
ReceiptList
Errores
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/receipts/{id}

Un recibo: tipo, el número tal como se imprime, estado, el pago que confirma, el importe congelado

Permiso
receipts:read
Parámetros
id (en la ruta)lang
Respuesta
Receipt
Errores
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/receipts/{id}/pdf

El PDF del recibo, el mismo que recibió el cliente. Cuando lleva los datos fiscales de quien pagó por cuenta del cliente, también necesita customers.fiscal:read (si no, 403)

Permiso
receipts:read
Parámetros
id (en la ruta)lang
Respuesta
application/pdf
Errores
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/events

Lo que ha pasado, en orden: lee después de tu cursor para mantenerte sincronizado. Cada evento necesita el permiso del objeto al que apunta. Mientras se carga la historia de la cuadra: 503 events-not-ready

Permiso
cualquier clave válida
Parámetros
langlimitafter
Respuesta
EventList
Errores
400 · 401 · 403 · 404 · 429 · 500 · 503
GET/api/v1/events/{id}

Un evento. De otra cuadra, o de un tipo que tu clave no lee: 404

Permiso
cualquier clave válida
Parámetros
id (en la ruta)lang
Respuesta
Event
Errores
400 · 401 · 403 · 404 · 429 · 500 · 503

Objetos

Problem

CampoTipoDescripción
typestring (uri)Estable, en inglés: decide según esto, no según el texto
titlestringEn inglés
statusinteger
detailstring · opcionalUna frase para las personas, en el idioma solicitado (?lang=, Accept-Language)
reasonstring · opcional
missing · malformed · wrong_environment · unknown · connection_revoked · revoked · expired · rotated
Solo 401: por qué la clave no es válida
missing_permissionstring · opcional
charges:read · payments:read · receipts:read · customers:read · customers.fiscal:read · external-documents:write
Solo 403 forbidden
invalid_paramstring · opcionalSolo 400: el parámetro que no es válido

Connection

CampoTipoDescripción
object"connection"
idstring (uuid)
namestring
permissionsarray de string
created_atstring (date-time)RFC 3339, UTC
keyobject
key.idstring (uuid)
key.last_fourstring
key.environmentstring
live · test
live = producción (sp_live_), test = staging (sp_test_)
key.created_atstring (date-time)RFC 3339, UTC
key.expires_atstring (date-time) · puede ser nullRFC 3339, UTC
key.retires_atstring (date-time) · puede ser nullTras una rotación: cuándo deja de funcionar esta clave

Organization

CampoTipoDescripción
object"organization"
idstring (uuid)
namestring
legal_namestring · puede ser null
countrystring · puede ser nullISO 3166-1 alpha-2
currencystringISO 4217
timezonestringIANA
languagestringEl idioma de la cuadra: Stable Pro no conoce el de cada cliente
localestringBCP 47, para el formato
taxesobject
taxes.calculated_bystring
stable_pro · external
external = Stable Pro no calcula los impuestos este mes: nada más
taxes.amount_basis"gross"Cada importe es el total que paga el cliente
receipts_shown_to_customersbooleanfalse: la cuadra ha elegido no dar los recibos de Stable Pro a sus clientes mientras haya un programa conectado; siguen existiendo y están numerados (GET /receipts)

Customer

CampoTipoDescripción
object"customer"
idstring (uuid)El código del cliente: nunca cambia
kindstring
member · staff
namestring
given_namestring · puede ser null
family_namestring · puede ser null
activebooleanfalse: ha dejado la cuadra, o se ha eliminado; sus cargos se pueden seguir facturando
created_atstring (date-time)RFC 3339, UTC
billing_addressobject · puede ser null · opcionalSolo con customers.fiscal:read
billing_address.line1string · puede ser null
billing_address.line2string · puede ser null
billing_address.postal_codestring · puede ser null
billing_address.citystring · puede ser null
billing_address.subdivisionstring · puede ser nullISO 3166-2 (IT-MI, US-OH)
billing_address.countrystring · puede ser nullISO 3166-1 alpha-2
billing_address_textstring · puede ser null · opcionalSolo con customers.fiscal:read: la antigua dirección en texto libre, solo mientras billing_address esté vacío
tax_identifiersarray de object · opcionalSolo con customers.fiscal:read
tax_identifiers[].schemestringVAT, o un ICD de ISO 6523 (0210 código fiscal italiano, 0211 número de IVA italiano)
tax_identifiers[].valuestring
tax_codestring · puede ser null · opcionalSolo con customers.fiscal:read: el antiguo código fiscal, sin esquema

CustomerList

CampoTipoDescripción
object"list"
dataarray de Customer
has_morebooleanHay una página siguiente: vuelve a pedir con starting_after = el id del último elemento

Balance

CampoTipoDescripción
object"balance"
customer_idstring (uuid)
currencystring
amount_dueintegerLo que se debe hoy: cargos ya visibles
amount_scheduledintegerCargos que serán visibles más adelante
creditintegerCrédito que se puede usar en un cargo
as_ofstring (date)Hoy, en la zona horaria de la cuadra

Charge

CampoTipoDescripción
object"charge"
idstring (uuid)
customer_idstring (uuid)
typestringLista abierta: boarding, service_charge, lesson_drop_in, lesson_plan, health_record, …
descriptionstringTal como lo escribió la cuadra
period_startstring (date)YYYY-MM-DD
period_endstring (date)YYYY-MM-DD
competence_monthstringYYYY-MM
accounting_monthstringEl posterior entre el mes de devengo y el de registro: lo calcula Stable Pro
due_datestring (date)YYYY-MM-DD
visible_fromstring (date)YYYY-MM-DD
quantity"1"
unitstring
MON · ANN · C62
UNECE Rec. 20
unit_amountintegerUnidades menores de la moneda (ISO 4217)
currencystring
original_amountintegerEn su origen
amountintegerAhora: el origen más las correcciones
amount_paidintegerUnidades menores de la moneda (ISO 4217)
amount_remainingintegerUnidades menores de la moneda (ISO 4217)
amount_basis"gross"
tax_calculated_bystring
stable_pro · external
tax_treatmentstring
standard_rated · zero_rated · not_calculated · undetermined
taxable_amountintegerUnidades menores de la moneda (ISO 4217)
taxesarray de object
taxes[].type"vat"Lista abierta: pueden llegar otros tipos
taxes[].jurisdictionstring · puede ser nullISO 3166-1 alpha-2 de la cuadra
taxes[].categorystring · puede ser nullUNCL 5305: S, Z, E, AE, K, G, O; null cuando no se declara
taxes[].rate_bpintegerPuntos básicos: 2200 = 22 %
taxes[].amountintegerUnidades menores de la moneda
taxes[].exemption_reasonstring · puede ser null · opcionalBT-120, solo con tipo cero
taxes[].exemption_reason_codestring · puede ser null · opcionalVATEX (BT-121), solo con tipo cero
created_atstring (date-time)RFC 3339, UTC

ChargeList

CampoTipoDescripción
object"list"
dataarray de Charge
has_morebooleanHay una página siguiente: vuelve a pedir con starting_after = el id del último elemento

Adjustment

CampoTipoDescripción
object"adjustment"
idstring (uuid)
charge_idstring (uuid)
customer_idstring (uuid)
direction"receivable"
actionstring · puede ser nullLista abierta de códigos (consulta /codes)
reasonstring · puede ser null
categorystring · puede ser null
originstring · puede ser nullHUMAN, SYSTEM, …
amountintegerCon signo: negativo reduce el cargo
consideration_effectstring
changes · none
changes: sigue una factura rectificativa (o nota de débito); none: un crédito incobrable, sin impuesto
taxesarray de objectCon changes: la diferencia de impuesto, ya calculada. Con none: vacío
taxes[].type"vat"Lista abierta: pueden llegar otros tipos
taxes[].jurisdictionstring · puede ser nullISO 3166-1 alpha-2 de la cuadra
taxes[].categorystring · puede ser nullUNCL 5305: S, Z, E, AE, K, G, O; null cuando no se declara
taxes[].rate_bpintegerPuntos básicos: 2200 = 22 %
taxes[].amountintegerUnidades menores de la moneda
taxes[].exemption_reasonstring · puede ser null · opcionalBT-120, solo con tipo cero
taxes[].exemption_reason_codestring · puede ser null · opcionalVATEX (BT-121), solo con tipo cero
taxable_amountinteger · puede ser nullUnidades menores de la moneda (ISO 4217)
currencystring
competence_monthstringYYYY-MM
accounting_monthstringYYYY-MM
occurred_atstring (date-time)RFC 3339, UTC
reverses_adjustment_idstring (uuid) · puede ser null
taxonomy_versioninteger

AdjustmentList

CampoTipoDescripción
object"list"
dataarray de Adjustment
has_morebooleanHay una página siguiente: vuelve a pedir con starting_after = el id del último elemento

Allocation

CampoTipoDescripción
object"allocation"
idstring (uuid)
payment_idstring (uuid)
charge_idstring (uuid)
amountintegerCon signo
currencystring · opcional
consideration_effect"none"

Payment

CampoTipoDescripción
object"payment"
idstring (uuid)
customer_idstring (uuid) · puede ser null
typestring
payment · credit_applied · offset · refund · moved_to_credit · reversal
Qué ha pasado con el dinero (lista abierta)
amountintegerEl dinero que se movió de verdad, con signo: un reembolso o una anulación es negativo, moved_to_credit es cero
currencystring
datestring (date)YYYY-MM-DD
accounting_monthstringYYYY-MM
methodstringcash, bank_transfer, pos, credit, compensazione, other (lista abierta)
referencestring · puede ser null
paid_byobject · puede ser nullQuien pagó por cuenta del cliente (un padre o una madre): no es un cliente por sí mismo
paid_by.kindstring · puede ser null
paid_by.namestring · puede ser null
paid_by.tax_codestring · puede ser null · opcionalSolo con customers.fiscal:read
paid_by.address_textstring · puede ser null · opcionalSolo con customers.fiscal:read
reverses_payment_idstring (uuid) · puede ser null
actionstring · puede ser nullSolo para anulaciones
reasonstring · puede ser null
categorystring · puede ser null
consideration_effect"none"
allocationsarray de Allocation
taxonomy_versioninteger · puede ser null
created_atstring (date-time)RFC 3339, UTC

PaymentList

CampoTipoDescripción
object"list"
dataarray de Payment
has_morebooleanHay una página siguiente: vuelve a pedir con starting_after = el id del último elemento

CreditEntry

CampoTipoDescripción
object"credit_entry"
idstring (uuid)
customer_idstring (uuid)
directionstring
credit · debit
credit: el crédito nace o crece; debit: se usa o se reembolsa
amountintegerSiempre positivo: direction indica el sentido
currencystring
sourcestringLista abierta de códigos
payment_idstring (uuid) · puede ser nullEl movimiento que lo causó
charge_idstring (uuid) · puede ser null
actionstring · puede ser null
reasonstring · puede ser null
categorystring · puede ser null
reverses_entry_idstring (uuid) · puede ser null
consideration_effect"none"
created_atstring (date-time)RFC 3339, UTC

CreditEntryList

CampoTipoDescripción
object"list"
dataarray de CreditEntry
has_morebooleanHay una página siguiente: vuelve a pedir con starting_after = el id del último elemento

Receipt

CampoTipoDescripción
object"receipt"
idstring (uuid)
kindstring
payment_receipt · refund_confirmation
payment_receipt: serie R, dinero recibido; refund_confirmation: serie RB, dinero reembolsado (lista abierta)
seriesstringR, RB (lista abierta): cada serie tiene su propia numeración
yearinteger
sequenceintegerNúmero correlativo dentro de la serie y el año, sin huecos
numberstringEl número tal como aparece impreso en el documento
statusstring
issued · voided
Un recibo anulado se queda, con su número
issued_atstring (date-time)RFC 3339, UTC
voided_atstring (date-time) · puede ser nullRFC 3339, UTC
operation_typestring · puede ser nullSolo para las confirmaciones de reembolso: voluntary_refund, payment_reversal, chargeback (lista abierta)
payment_idstring (uuid) · puede ser nullEl cobro, o el reembolso, que confirma el recibo
charge_idstring (uuid) · puede ser nullSolo los recibos del modelo antiguo, emitidos sobre un cargo en lugar de un cobro
customer_idstring (uuid) · puede ser null
amountinteger · puede ser nullTal como quedó congelado en el documento, con signo: una confirmación de reembolso es negativa
currencystring
pdf_availablebooleanfalse solo para los recibos más antiguos, emitidos antes de los documentos congelados: no hay hoja que reimprimir
fiscal_document"false"Una confirmación de pago: el documento fiscal lo emite tu programa

ReceiptList

CampoTipoDescripción
object"list"
dataarray de Receipt
has_morebooleanHay una página siguiente: vuelve a pedir con starting_after = el id del último elemento

Event

CampoTipoDescripción
object"event"
idstring (uuid)Estable, único entre todas las cuadras: úsalo para reconocer un evento ya procesado
typestringLista abierta: customer.updated, charge.created, charge.due_date_changed, charge.tax_changed, adjustment.created, payment.created, allocation.created, credit_entry.created, receipt.issued, receipt.voided
dataobject
data.objectstringLista abierta: customer, charge, adjustment, payment, allocation, credit_entry, receipt
data.idstring (uuid)
data.urlstringDónde leerlo, a partir del host: /api/v1/charges/{id}
occurred_atstring (date-time)Cuándo ocurrió el hecho: la hora de creación, emisión o anulación; para un cambio de impuesto, su creación
recorded_atstring (date-time)Cuándo se escribió el evento: para los eventos históricos, el día en que se cargó la historia
historicalbooleantrue: un hecho de antes de que existieran los eventos, cargado una vez, ordenado por su fecha

EventList

CampoTipoDescripción
object"list"
dataarray de Event
has_morebooleanVuelve a pedir con after = next_cursor. Una página puede contener menos eventos que limit, incluso ninguno, mientras has_more es true
next_cursorstring (uuid) · puede ser nullGuárdalo después de procesar la página y devuélvelo como after. Puede ser el id de un evento que no se te muestra. null solo cuando la cuadra aún no tiene eventos para ti

Codes

CampoTipoDescripción
object"codes"
languagestringEl idioma de los nombres: ?lang=, luego Accept-Language y, por último, en (inglés)
taxonomy_versionintegerLa taxonomía de la que vienen action, reason y category
listsobject
lists.charge_typeobject
lists.charge_type.fieldsarray de stringDónde aparecen estos códigos: resource.field
lists.charge_type.codesarray de object
lists.charge_type.codes[].codestring
lists.charge_type.codes[].namestring
lists.actionobject
lists.action.fieldsarray de stringDónde aparecen estos códigos: resource.field
lists.action.codesarray de object
lists.action.codes[].codestring
lists.action.codes[].namestring
lists.reasonobject
lists.reason.fieldsarray de stringDónde aparecen estos códigos: resource.field
lists.reason.codesarray de object
lists.reason.codes[].codestring
lists.reason.codes[].namestring
lists.reason.codes[].actionstringEl nombre de un reason depende de su action: búscalo con los dos
lists.reason.codes[].categorystring
lists.categoryobject
lists.category.fieldsarray de stringDónde aparecen estos códigos: resource.field
lists.category.codesarray de object
lists.category.codes[].codestring
lists.category.codes[].namestring
lists.originobject
lists.origin.fieldsarray de stringDónde aparecen estos códigos: resource.field
lists.origin.codesarray de object
lists.origin.codes[].codestring
lists.origin.codes[].namestring
lists.payment_typeobject
lists.payment_type.fieldsarray de stringDónde aparecen estos códigos: resource.field
lists.payment_type.codesarray de object
lists.payment_type.codes[].codestring
lists.payment_type.codes[].namestring
lists.payment_methodobject
lists.payment_method.fieldsarray de stringDónde aparecen estos códigos: resource.field
lists.payment_method.codesarray de object
lists.payment_method.codes[].codestring
lists.payment_method.codes[].namestring
lists.credit_sourceobject
lists.credit_source.fieldsarray de stringDónde aparecen estos códigos: resource.field
lists.credit_source.codesarray de object
lists.credit_source.codes[].codestring
lists.credit_source.codes[].namestring
lists.receipt_kindobject
lists.receipt_kind.fieldsarray de stringDónde aparecen estos códigos: resource.field
lists.receipt_kind.codesarray de object
lists.receipt_kind.codes[].codestring
lists.receipt_kind.codes[].namestring
lists.refund_operationobject
lists.refund_operation.fieldsarray de stringDónde aparecen estos códigos: resource.field
lists.refund_operation.codesarray de object
lists.refund_operation.codes[].codestring
lists.refund_operation.codes[].namestring
lists.tax_categoryobjectUNCL 5305
lists.tax_category.fieldsarray de stringDónde aparecen estos códigos: resource.field
lists.tax_category.codesarray de object
lists.tax_category.codes[].codestring
lists.tax_category.codes[].namestring
lists.unitobjectUNECE Rec. 20
lists.unit.fieldsarray de stringDónde aparecen estos códigos: resource.field
lists.unit.codesarray de object
lists.unit.codes[].codestring
lists.unit.codes[].namestring
lists.event_typeobject
lists.event_type.fieldsarray de stringDónde aparecen estos códigos: resource.field
lists.event_type.codesarray de object
lists.event_type.codes[].codestring
lists.event_type.codes[].namestring