openapi: 3.0.3 info: title: "Platforma de Coleta de Métricas" description: | # Introdução A Platforma de Coleta de Métricas foi idealizada com o objetivo de contabilizar as interações entre as instituições participantes, de modo a promover um ambiente equitativo e não discriminatório. Se trata de uma Platforma localizada no perímetro central, gerida pelo regulador do ecossistema. ## Motivação Para que o ecossistema do Open Finance Brasil seja saudável para instituições e clientes finais, fez-se necessária a criação de uma Platforma que deverá concentrar dados sobre as chamadas que as instituições fazem umas às outras. Dessa forma, torna-se possível coletar informações com o objetivo de se criar métricas e indicadores a fim de se ter visibilidade sobre todo o ambiente. No intuito de manter a integridade e consistência nos dados, o envio destes pelas instituições deverá passar por um processo de conciliação. Quando divergente, as instituições serão notificadas e terão a possibilidade de ajustar os reportes, o que promove um ambiente saudável de auto-regulação, prevenindo assim uma disputa. ## O que a Platforma não é A Platforma recebe os dados de maneira póstuma, ou seja, dentro do período de fechamento mas depois de a chamada concreta ter sido feita. Dada essa natureza, a Platforma não pode atuar como um agente que proíbe, bloqueia ou interfere nas interações entre as instituiçoes. Por mais que concentre informações importantes das chamadas entre as instituições, a Platforma não é uma ferramenta de BI, e o controle de acesso aos dados é feito em diferentes níveis (participante, regulador e administrador). ## Premissas Técnicas * Tanto o envio por parte dos participantes quanto o processamento por parte da Platforma serão feitos de maneira assíncrona; ## Terminologia * **Server e Client**: em uma interação, a parte que solicita os dados é chamada de _client_, ao passo que a parte que devolve os dados é o _server_. O ponto de vista para o uso dessa terminologia é o tráfego dos dados da transação e não o ponto de partida da chamada. Portanto, supondo que A faça uma consulta em B pelos dados de uma conta, esses dados vão ser transmitidos por quem recebeu a solicitação, e recebidos por quem a fez, nesse caso, "A" é o Client e "B" é o Server. * **Reporte**: no contexto da API de Coleta de Métricas, um _reporte_ é o registro da chamada que será enviado tanto pelo server quanto pelo client. Esse registro será armazenado na Platforma para posterior processo de conciliação de chamadas e extração de dados estatísticos. * **Divergência**: Quando Server e Client enviam reportes, cada um destes reportes se refere à uma chamada em específico. Nos casos em que uma das partes não envia o reporte sobre essa chamada em específico, é caracterizada uma divergência. As divergências podem ser resolvidas pela chamada às operações de modificação de reportes em suas respectivas APIs. Uma divergência é considerada fechada apenas quando todos os reportes encontram sua respectiva correspondência do outro lado da chamada. Para informações detalhadas sobre a PCM, consulte o [site da documentação da Plataforma](https://openfinancebrasil.atlassian.net/wiki/spaces/OF/pages/17378055/Plataforma+de+Coleta+de+M+tricas). version: 1.0.2 security: - PCMAccessToken: [] servers: - url: https://api.pcm.sandbox.openfinancebrasil.org.br description: UAT - url: https://api.pcm.openfinancebrasil.org.br description: Produção tags: - name: Hybrid Flow description: | A Hybrid Flow API fornece operações que permitem a inclusão de relatórios com informações ao longo do fluxo de execução do consentimento. ![Sample Image](https://github.com/OpenBanking-Brasil/specs-pcm/blob/feature/PCM-122/openapi/hybrid-flow-diagram.svg?raw=true) - name: Private API description: | A Private API fornece operações que permitem a inclusão, consulta e alteração dos reportes que representam transações entre participantes do ecossistema do Open Finance. - name: Opendata API description: | A Opendata API fornece operações que permitem a inclusão, consulta e alteração dos reportes cujas chamadas foram feitas nas API de dados abertos do Open Finance, e que portanto não sofrem processo de conciliação. paths: "/report-api/v1/private/report": post: tags: - Private API summary: Inclusão de reportes description: | Inclusão de reportes na plataforma. Ao enviar um lote de reportes, a plataforma vai fazer o processo de validação de cada reporte de maneira síncrona e devolver o resultado dessa validação na resposta. O status HTTP de retorno será 200 caso **todos** dos reportes enviados forem aceitos. Caso pelo menos 1 reporte esteja inconsistente, o status de retorno será 207 - vide documentação de cada status de retorno para maiores informações. Os dados que são inseridos na API de Reporte são sempre processados de maneira assíncrona, e sua persistência se utiliza de consistência posterior (eventual consistency), portanto, um registro tem um tempo de processamento em que ele não estará disponível para consulta até que ele seja persistido. O limite de reportes de cada envio de lote é de 5.000 entradas no array. operationId: add-reports requestBody: content: application/json: schema: type: array maxItems: 5000 items: oneOf: - $ref: "#/components/schemas/ClientReportRequest" - $ref: "#/components/schemas/ServerReportRequest" examples: "Request Valido": description: O request apresentado tem todos os campos validados. value: - timestamp: "2021-11-11T18:08:08.894Z" fapiInteractionId: "d78fc4e5-37ca-4da3-adf2-9b082bf92280" clientSSId: "f0b5419b-2b5f-4f59-9862-6d2a8e23be26" clientOrgId: "082ff90b-9d65-46bb-b123-b88eb47fd61c" serverOrgId: "b8e34d5a-2ed5-451e-8ddb-45a1edc76243" endpoint: "/open-banking/products-services/v1/business-financings" statusCode: 200 httpMethod: GET correlationId: "wNupARo7I9E2PLJZph18a0M9y7DcUe7ITt3DqUOJd9NVjnskxf" processTimespan: 120 endpointUriPrefix: "https://ofin.bank.com/" role: CLIENT additionalInfo: personType: "PF" consentId: "uri:bank:d1541b17-3175-477d-a52b-2813ae2c4c36" - timestamp: "2021-11-11T19:22:10.334Z" fapiInteractionId: "0786fce3-a36f-43f8-b66a-d26ab1dfc639" clientSSId: "f0b5419b-2b5f-4f59-9862-6d2a8e23be26" clientOrgId: "082ff90b-9d65-46bb-b123-b88eb47fd61c" serverOrgId: "b8e34d5a-2ed5-451e-8ddb-45a1edc76243" endpoint: "/open-banking/products-services/v1/business-financings" statusCode: 200 httpMethod: GET correlationId: "8qPzRL4nBzesCc3H1827UlqqEuTT4F5lN82DuJllcnL5VnnY5j" processTimespan: 117 endpointUriPrefix: "https://ofin.bank.com/" role: CLIENT additionalInfo: personType: "PF" consentId: "uri:bank:d1541b17-3175-477d-a52b-2813ae2c4c36" - timestamp: "2021-11-11T19:41:41.811Z" fapiInteractionId: "d1541b17-3175-477d-a52b-2813ae2c4c36" clientOrgId: "082ff90b-9d65-46bb-b123-b88eb47fd61c" serverOrgId: "b8e34d5a-2ed5-451e-8ddb-45a1edc76243" endpoint: "/open-banking/products-services/v1/business-financings" statusCode: 200 httpMethod: GET processTimespan: 125 role: SERVER required: true responses: "200": description: | O status 200 representa a situação onde todos os registros enviados no lote foram validados e serão direcionados para processamento. Se pelo menos 1 registro contiver problemas de validação, o retorno será 207 (vide descrição do status). A operação vai devolver um array com todos os resultados, e garante que ele esteja na mesma ordem do array da requisição. content: application/json: schema: type: array maxItems: 5000 items: $ref: "#/components/schemas/ReportResponse" examples: Todos Processados: description: Esta seria a resposta para uma solicitação com o exemplo "Request Válido" da documentação. O payload da resposta vem na mesma ordem do array da solicitação. Uma vez que todos os registros foram validados, o status de retorno é o 200. value: - reportId: 424ad55c-36cc-4077-b85e-c22ea984cc4a correlationId: wNupARo7I9E2PLJZph18a0M9y7DcUe7ITt3DqUOJd9NVjnskxf status: ACCEPTED - reportId: 4095388d-f44f-499a-a9a7-2dbffce1bb8a correlationId: 8qPzRL4nBzesCc3H1827UlqqEuTT4F5lN82DuJllcnL5VnnY5j status: ACCEPTED - reportId: 0f3fcceb-39f6-41b4-a75d-8444244bd836 status: ACCEPTED "207": description: | O status 207 (Multi-Status) informa ao solicitante que o formato da requisição está correto, mas que entradas do array contém erro de validação em pelo menos 1 item. Ou seja, se todos os elementos do array informado estiverem com falha de validação, a operação vai devolver o status 207, e no corpo da resposta todos os elementos do array vão estar com status `DISCARDED` e com sua respectiva mensagem. A operação vai devolver um array com todos os resultados, e garante que ele esteja na mesma ordem do array da requisição. content: application/json: schema: type: array maxItems: 5000 items: $ref: "#/components/schemas/ReportResponse" examples: "Primeiro registro com falha": description: | No caso apresentado é o resultado onde o exemplo "Request com falha" foi enviado: o registro com o _fapiInteractionId_ `d78fc4e5-37ca-4da3-adf2-9b082bf92280` apresentou uma falha na validação, mas os demais foram enviados para processamento. Como um dos registros não foi validado, o status de retorno passa a ser 207, e os demais registros são processados normalmente. value: - reportId: 424ad55c-36cc-4077-b85e-c22ea984cc4a correlationId: wNupARo7I9E2PLJZph18a0M9y7DcUe7ITt3DqUOJd9NVjnskxf status: DISCARDED message: "Missing fields: 'fapiInteractionId'" - reportId: 4095388d-f44f-499a-a9a7-2dbffce1bb8a correlationId: 8qPzRL4nBzesCc3H1827UlqqEuTT4F5lN82DuJllcnL5VnnY5j status: ACCEPTED - reportId: 0f3fcceb-39f6-41b4-a75d-8444244bd836 status: ACCEPTED "Todos registros com falha": description: | Neste caso, parte-se da premissa que todos os registros foram enviados sem _correlationId_ e sem _uri_. Nesse caso, todos vão falhar na etapa de validação, mas mesmo quando todos os registros falham, o status de retorno é o 207. value: - reportId: 424ad55c-36cc-4077-b85e-c22ea984cc4a status: DISCARDED message: "Missing fields: 'fapiInteractionId'" - reportId: 4095388d-f44f-499a-a9a7-2dbffce1bb8a status: DISCARDED message: "Missing fields: 'fapiInteractionId'" - reportId: 0f3fcceb-39f6-41b4-a75d-8444244bd836 status: DISCARDED message: "Missing fields: 'fapiInteractionId'" "Campo obrigatório não enviado": description: | Registro com campo obrigatório não enviado. value: - reportId: 424ad55c-36cc-4077-b85e-c22ea984cc4a, correlationId: wNupARo7I9E2PLJZph18a0M9y7DcUe7ITt3DqUOJd9NVjnskxf, status: DISCARDED, message: "Missing fields: 'statusCode'" "400": description: O formato do corpo da requisição não é um array. content: application/json: schema: $ref: "#/components/schemas/GenericError" examples: "400": value: message: "Invalid payload format: MUST be an array" "413": description: A quantidade de registros enviado excede o limite da operação (5.000 elementos no array), ou o tamanho do payload excede 10Mb. content: application/json: schema: $ref: "#/components/schemas/GenericError" examples: "Limite de registros excedido": value: message: Record limit exceeded "401": $ref: "#/components/responses/Default401Unauthorized" "403": $ref: "#/components/responses/Default403Forbidden" "406": $ref: "#/components/responses/Default406NotAcceptable" "415": $ref: "#/components/responses/Default415UnsupportedMediaType" "429": $ref: "#/components/responses/Default429TooManyRequests" default: $ref: "#/components/responses/Default500InternalServerError" "/report-api/v2/hybrid-flow/client/redirect-to-server": post: tags: - Hybrid Flow summary: Inclusão de relatório Hybrid Flow de redirecionamento para o servidor (lado cliente) description: | Inclusão de relatório de redirecionamento para o servidor na Platforma. Ao enviar um relatório, a Platforma vai fazer o processo de validação de maneira síncrona e devolver o resultado dessa validação na resposta. O status HTTP de retorno será 200 caso o reporte enviado seja aceito. operationId: add-reports-client-redirect-to-server requestBody: content: application/json: schema: $ref: "#/components/schemas/HybridFlowClientRedirectToServerReportRequest" examples: "Request Válido": description: O request apresentado tem todos os campos validados. required: true responses: "200": description: | O status 200 representa a situação onde o registro enviado foi validado. content: application/json: schema: $ref: "#/components/schemas/HybridFlowReportResponse" examples: Item processado: description: Esta seria a resposta para uma solicitação com o exemplo "Request Válido" da documentação. "400": description: O formato do corpo da requisição não é um objeto válido. content: application/json: schema: $ref: "#/components/schemas/GenericError" examples: "400": value: message: "Report Invalid" "401": $ref: "#/components/responses/Default401Unauthorized" "403": $ref: "#/components/responses/Default403Forbidden" "406": $ref: "#/components/responses/Default406NotAcceptable" "415": $ref: "#/components/responses/Default415UnsupportedMediaType" "429": $ref: "#/components/responses/Default429TooManyRequests" default: $ref: "#/components/responses/Default500InternalServerError" "/report-api/v2/hybrid-flow/server/redirect-target": post: tags: - Hybrid Flow summary: Inclusão de relatório Hybrid Flow de redirecionamento para o destino (lado servidor) description: | Inclusão de relatório de redirecionamento para o destino na Platforma. Ao enviar um relatório, a Platforma vai fazer o processo de validação de maneira síncrona e devolver o resultado dessa validação na resposta. O status HTTP de retorno será 200 caso o reporte enviado seja aceito. operationId: add-reports-server-redirect-target requestBody: content: application/json: schema: $ref: "#/components/schemas/HybridFlowServerRedirectTargetReportRequest" examples: "Request Válido": description: O request apresentado tem todos os campos validados. required: true responses: "200": description: | O status 200 representa a situação onde o registro enviado foi validado e será validado. Se o registro contiver problemas de validação. A operação vai devolver um objeto com resultado. content: application/json: schema: $ref: "#/components/schemas/HybridFlowReportResponse" "400": description: O formato do corpo da requisição não é um objeto válido. content: application/json: schema: $ref: "#/components/schemas/GenericError" examples: "400": value: message: "Report Invalid" "401": $ref: "#/components/responses/Default401Unauthorized" "403": $ref: "#/components/responses/Default403Forbidden" "406": $ref: "#/components/responses/Default406NotAcceptable" "415": $ref: "#/components/responses/Default415UnsupportedMediaType" "429": $ref: "#/components/responses/Default429TooManyRequests" default: $ref: "#/components/responses/Default500InternalServerError" "/report-api/v2/hybrid-flow/server/authenticated": post: tags: - Hybrid Flow summary: Inclusão de relatório Hybrid Flow de autenticação (lado servidor) description: | Inclusão de relatório de autenticação na Platforma. Ao enviar um relatório, a Platforma vai fazer o processo de validação de maneira síncrona e devolver o resultado dessa validação na resposta. O status HTTP de retorno será 200 caso o reporte enviado seja aceito. operationId: add-reports-server-authenticated requestBody: content: application/json: schema: $ref: "#/components/schemas/HybridFlowServerAuthenticatedRequest" examples: "Request Válido": description: O request apresentado tem todos os campos validados. required: true responses: "200": description: | O status 200 representa a situação onde o registro enviado foi validado. content: application/json: schema: $ref: "#/components/schemas/HybridFlowReportResponse" examples: Item processado: description: Esta seria a resposta para uma solicitação com o exemplo "Request Válido" da documentação. "400": description: O formato do corpo da requisição não é um objeto válido. content: application/json: schema: $ref: "#/components/schemas/GenericError" examples: "400": value: message: "Report Invalid" "401": $ref: "#/components/responses/Default401Unauthorized" "403": $ref: "#/components/responses/Default403Forbidden" "406": $ref: "#/components/responses/Default406NotAcceptable" "415": $ref: "#/components/responses/Default415UnsupportedMediaType" "429": $ref: "#/components/responses/Default429TooManyRequests" default: $ref: "#/components/responses/Default500InternalServerError" "/report-api/v2/hybrid-flow/server/redirect-to-client": post: tags: - Hybrid Flow summary: Inclusão de relatório Hybrid Flow de redirecionamento para o cliente (lado servidor) description: | Inclusão de relatório de redirecionamento para o cliente na Platforma. Ao enviar um relatório, a Platforma vai fazer o processo de validação de maneira síncrona e devolver o resultado dessa validação na resposta. O status HTTP de retorno será 200 caso o reporte enviado seja aceito. operationId: add-reports-server-redirect-to-client requestBody: content: application/json: schema: $ref: "#/components/schemas/HybridFlowServerRedirectToClientRequest" examples: "Request Válido": description: O request apresentado tem todos os campos validados. required: true responses: "200": description: | O status 200 representa a situação onde o registro enviado foi validado. content: application/json: schema: $ref: "#/components/schemas/HybridFlowReportResponse" examples: Item processado: description: Esta seria a resposta para uma solicitação com o exemplo "Request Válido" da documentação. "400": description: O formato do corpo da requisição não é um objeto válido. content: application/json: schema: $ref: "#/components/schemas/GenericError" examples: "400": value: message: "Report Invalid" "401": $ref: "#/components/responses/Default401Unauthorized" "403": $ref: "#/components/responses/Default403Forbidden" "406": $ref: "#/components/responses/Default406NotAcceptable" "415": $ref: "#/components/responses/Default415UnsupportedMediaType" "429": $ref: "#/components/responses/Default429TooManyRequests" default: $ref: "#/components/responses/Default500InternalServerError" "/report-api/v2/hybrid-flow/client/redirect-target-with-errors": post: tags: - Hybrid Flow summary: Inclusão de relatório Hybrid Flow de redirecionamento com erro para o destino (lado cliente) description: | Inclusão de relatório de redirecionamento com erro para o destino na Platforma. Ao enviar um relatório, a Platforma vai fazer o processo de validação de maneira síncrona e devolver o resultado dessa validação na resposta. O status HTTP de retorno será 200 caso o reporte enviado seja aceito. operationId: add-reports-client-redirect-target-with-errors requestBody: content: application/json: schema: $ref: "#/components/schemas/HybridFlowServerRedirectTargetWithErrorsRequest" examples: "Request Válido": description: O request apresentado tem todos os campos validados. required: true responses: "200": description: | O status 200 representa a situação onde o registro enviado foi validado. content: application/json: schema: $ref: "#/components/schemas/HybridFlowReportResponse" examples: Item processado: description: Esta seria a resposta para uma solicitação com o exemplo "Request Válido" da documentação. "400": description: O formato do corpo da requisição não é um objeto válido. content: application/json: schema: $ref: "#/components/schemas/GenericError" examples: "400": value: message: "Report Invalid" "401": $ref: "#/components/responses/Default401Unauthorized" "403": $ref: "#/components/responses/Default403Forbidden" "406": $ref: "#/components/responses/Default406NotAcceptable" "415": $ref: "#/components/responses/Default415UnsupportedMediaType" "429": $ref: "#/components/responses/Default429TooManyRequests" default: $ref: "#/components/responses/Default500InternalServerError" "/report-api/v2/hybrid-flow/client/redirect-target-without-errors": post: tags: - Hybrid Flow summary: Inclusão de relatório Hybrid Flow de redirecionamento sem erro para o destino (lado cliente) description: | Inclusão de relatório de redirecionamento sem erro para o destino na Platforma. Ao enviar um relatório, a Platforma vai fazer o processo de validação de maneira síncrona e devolver o resultado dessa validação na resposta. O status HTTP de retorno será 200 caso o reporte enviado seja aceito. operationId: add-reports-client-redirect-target-without-errors requestBody: content: application/json: schema: $ref: "#/components/schemas/HybridFlowServerRedirectTargetWithoutErrorsRequest" examples: "Request Válido": description: O request apresentado tem todos os campos validados. required: true responses: "200": description: | O status 200 representa a situação onde o registro enviado foi validado. content: application/json: schema: $ref: "#/components/schemas/HybridFlowReportResponse" examples: Item processado: description: Esta seria a resposta para uma solicitação com o exemplo "Request Válido" da documentação. "400": description: O formato do corpo da requisição não é um objeto válido. content: application/json: schema: $ref: "#/components/schemas/GenericError" examples: "400": value: message: "Report Invalid" "401": $ref: "#/components/responses/Default401Unauthorized" "403": $ref: "#/components/responses/Default403Forbidden" "406": $ref: "#/components/responses/Default406NotAcceptable" "415": $ref: "#/components/responses/Default415UnsupportedMediaType" "429": $ref: "#/components/responses/Default429TooManyRequests" default: $ref: "#/components/responses/Default500InternalServerError" "/report-api/v1/private/report/{reportId}": get: tags: - Private API summary: Consulta um report em específico usando um identificador description: | Operação que permite a consulta de um reporte em específico através de um identificador. A busca por reportes estará sempre no contexto do usuário representado pelo token de acesso, ou seja, o _participante_ só terá acesso à reportes em que instituição que ele pertence é parte, seja como client ou como server. O processamento do registro ocorre de maneira assíncrona, o que pode gerar um cenário de consistência eventual: caso a consulta seja feita imediatamente após a inclusão, é possível que o registro ainda não esteja disponível para consulta. operationId: report-by-id parameters: - name: reportId description: Identificador do reporte que está sendo consultado in: path required: true schema: type: string pattern: ^[- /:_.',0-9a-zA-Z]{0,100}$ maxLength: 100 responses: "200": description: Consulta realizada com sucesso content: application/json: schema: $ref: "#/components/schemas/ReportModel" "404": description: O registro com o identificador informado não foi encontrado. content: application/json: schema: $ref: "#/components/schemas/GenericError" "401": $ref: "#/components/responses/Default401Unauthorized" "403": $ref: "#/components/responses/Default403Forbidden" "406": $ref: "#/components/responses/Default406NotAcceptable" "429": $ref: "#/components/responses/Default429TooManyRequests" default: $ref: "#/components/responses/Default500InternalServerError" put: tags: - Private API summary: Modifica um reporte baseado em seu reportId description: | Operação que permite a alteração de parâmetros de um reporte com base em seu reportId. A alteração do report é feita de forma assíncrona. Logo, se for feito um GET logo apos o PUT o reporte ainda será entregue sem alterações. Não resubmeta o PUT. Importante: Apenas os campos statusCode, httpMethod, processTimespan e endpoint podem ser modificados nessa operação. Apenas reportes no estado PAIRED_INCONSISTENT podem ser modificados. Necessidades adicionais de modificação por API podem ser sugeridas ao email: gt-arquitetura@openfinancebrasil.org.br operationId: put-report-by-id parameters: - name: reportId description: Identificador do reporte (campo `reportId`) que está sendo modificado in: path required: true schema: type: string pattern: ^[- /:_.',0-9a-zA-Z]{0,100}$ maxLength: 100 requestBody: content: application/json: schema: oneOf: - $ref: "#/components/schemas/ClientReportRequest" - $ref: "#/components/schemas/ServerReportRequest" responses: "202": description: Modificação submetida com sucesso content: application/json: schema: $ref: "#/components/schemas/EmptyObject" example: {} "400": description: O reporte enviado está inconsistente content: application/json: schema: $ref: "#/components/schemas/GenericError" example: message: "Invalid field value: httpMethod" "401": $ref: "#/components/responses/Default401Unauthorized" "403": $ref: "#/components/responses/Default403Forbidden" "404": $ref: "#/components/responses/Default404NotFound" "406": $ref: "#/components/responses/Default406NotAcceptable" "429": $ref: "#/components/responses/Default429TooManyRequests" default: $ref: "#/components/responses/Default500InternalServerError" "/report-api/v1/opendata/report": post: tags: - Opendata API summary: Inclusão de reportes description: | Inclusão de reportes de dados abertos na plataforma. Ao enviar um lote de reportes, a plataforma vai fazer o processo de validação sintática de cada reporte de maneira síncrona e devolver o resultado dessa validação na resposta. O status HTTP de retorno será 200 caso **todos** dos reportes enviados forem aceitos. Caso pelo menos 1 reporte esteja inconsistente, o status de retorno será 207 - vide documentação de cada status de retorno para maiores informações. Os dados que são inseridos na API de Reporte são sempre processados de maneira assíncrona, e sua persistência se utiliza de consistência posterior (eventual consistency), portanto, um registro tem um tempo de processamento em que ele não estará disponível para consulta até que ele seja persistido. O limite de registros de cada lote é de 5.000 registros. operationId: add-opendata-reports requestBody: content: application/json: schema: type: array maxItems: 5000 items: $ref: "#/components/schemas/OpendataReportRequest" examples: "Request Valido": description: O request apresentado tem todos os campos validados. value: - timestamp: "2021-11-11T18:08:08.468Z" endpoint: "/open-banking/products-services/v1/business-financings" statusCode: 200 httpMethod: GET processTimespan: 120 additionalInfo: clientIp: 192.168.10.10 - timestamp: "2021-11-11T19:22:10.396Z" endpoint: "/open-banking/products-services/v1/business-financings" statusCode: 200 httpMethod: GET processTimespan: 117 additionalInfo: clientIp: 192.168.10.11 required: true responses: "200": description: | O status 200 representa a situação onde todos os registros enviados no lote foram validados e serão direcionados para processamento. Se pelo menos 1 registro contiver problemas de validação, o retorno será 207 (vide descrição do status). A operação vai devolver um array com todos os resultados, e garante que ele esteja na mesma ordem do array da requisição. content: application/json: schema: type: array maxItems: 5000 items: $ref: "#/components/schemas/ReportResponse" examples: Todos Processados: description: Esta seria a resposta para uma solicitação com o exemplo "Request Válido" da documentação. O payload da resposta vem na mesma ordem do array da solicitação. Todos registros que chegarem com o atributo _correlationId_ o receberão de volta. Uma vez que todos os registros foram validados, o status de retorno é o 200. value: - reportId: 424ad55c-36cc-4077-b85e-c22ea984cc4a status: ACCEPTED - reportId: 4095388d-f44f-499a-a9a7-2dbffce1bb8a status: ACCEPTED "207": description: | O status 207 (Multi-Status) informa ao solicitante que o formato da solicitação está correto, mas que entradas do array da solicitação contém erro de validação em pelo menos uma entrada. Ou seja, se todos os elementos do array informado estiverem com falha de validação, a operação vai devolver o status 207, e no corpo da resposta todos os elementos do array vão estar com status `DISCARDED` e com sua respectiva mensagem. A operação vai devolver um array com todos os resultados, e garante que ele esteja na mesma ordem do array da requisição. content: application/json: schema: type: array maxItems: 5000 items: $ref: "#/components/schemas/ReportResponse" examples: "Primeiro registro com falha": description: | No caso apresentado é o resultado onde o exemplo "Request com falha" foi enviado: o registro com o _fapiInteractionId_ `d78fc4e5-37ca-4da3-adf2-9b082bf92280` apresentou uma falha na validação, mas os demais foram enviados para processamento. Como um dos registros não foi validado, o status de retorno passa a ser 207, e os demais registros são processados normalmente. value: - reportId: 424ad55c-36cc-4077-b85e-c22ea984cc4a status: DISCARDED message: "Missing fields: 'uri'" - reportId: 4095388d-f44f-499a-a9a7-2dbffce1bb8a status: ACCEPTED - reportId: 0f3fcceb-39f6-41b4-a75d-8444244bd836 status: ACCEPTED "Todos registros com falha": description: | Neste caso, parte-se da premissa que todos os registros foram enviados com algum campo faltante. Nesse caso, todos vão falhar na etapa de validação, mas mesmo quando todos os registros falham, o status de retorno é o 207. value: - reportId: 424ad55c-36cc-4077-b85e-c22ea984cc4a status: DISCARDED message: "Missing fields: 'uri'" - reportId: 4095388d-f44f-499a-a9a7-2dbffce1bb8a status: DISCARDED message: "Missing fields: 'additionalInfo'" - reportId: 0f3fcceb-39f6-41b4-a75d-8444244bd836 status: DISCARDED message: "Missing fields: 'httpMethod'" "400": description: O formato do corpo da requisição não é um array. content: application/json: schema: $ref: "#/components/schemas/GenericError" examples: "400": value: message: "Invalid payload format: MUST be an array" "413": description: A quantidade de registros enviado excede o limite da operação, ou o tamanho do payload excede o limite configurado no servidor http. content: application/json: schema: $ref: "#/components/schemas/GenericError" examples: "Limite de registros excedido": value: message: Record limit exceeded "401": $ref: "#/components/responses/Default401Unauthorized" "403": $ref: "#/components/responses/Default403Forbidden" "406": $ref: "#/components/responses/Default406NotAcceptable" "415": $ref: "#/components/responses/Default415UnsupportedMediaType" "429": $ref: "#/components/responses/Default429TooManyRequests" default: $ref: "#/components/responses/Default500InternalServerError" components: schemas: Platform: type: string enum: - browser - app example: browser URI: type: string format: uri pattern: ^(https:\/\/)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&\/\/=]*)$ maxLength: 2000 example: https://api.banco.com.br/open-banking/api/v1/resource Timestamp: description: Data/Hora UTC no formato ISO8601 com milissegundos (YYYY-MM-DDTHH:mm:ss.sssZ) do momento em que a chamada foi disparada, imediatamente antes do primeiro byte enviado na requisição. type: string format: date-time maxLength: 28 example: "2021-11-11T18:08:08.278Z" ConsentId: type: string pattern: ^urn:[a-zA-Z0-9][a-zA-Z0-9-]{0,31}:[a-zA-Z0-9()+,\-.:=@;$_!*'%\/?#]+$ maxLength: 256 example: urn:bancoex:C1DD33123 description: | O consentId é o identificador único do consentimento e deverá ser um URN - Uniform Resource Name. Um URN, conforme definido na RFC8141 é um Uniform Resource Identifier - URI - que é atribuído sob o URI scheme "urn" e um namespace URN específico, com a intenção de que o URN seja um identificador de recurso persistente e independente da localização. Considerando a string urn:bancoex:C1DD33123 como exemplo para consentId temos: * o namespace(urn) * o identificador associado ao namespace da instituição transnmissora (bancoex) * o identificador específico dentro do namespace (C1DD33123). Informações mais detalhadas sobre a construção de namespaces devem ser consultadas na RFC8141. OSType: type: string example: linux enum: - linux - macos - unix - windows - ios - android - other HybridFlowClientRedirectToServerReportRequest: description: "" type: object required: - "consentId" - "uriAuthorizationEndpoint" - "platform" - "osVersion" - "os" - "timestamp" properties: consentId: $ref: "#/components/schemas/ConsentId" uriAuthorizationEndpoint: $ref: "#/components/schemas/URI" Platform: $ref: "#/components/schemas/Platform" osVersion: type: string os: $ref: "#/components/schemas/OSType" timestamp: $ref: "#/components/schemas/Timestamp" HybridFlowServerRedirectTargetReportRequest: description: "" type: object required: - "consentId" - "uriAuthorizationEndpoint" - "osVersion" - "os" - "type" - "timestamp" properties: consentId: $ref: "#/components/schemas/ConsentId" uriAuthorizationEndpoint: $ref: "#/components/schemas/URI" osVersion: type: string os: $ref: "#/components/schemas/OSType" type: type: string enum: - AWAITING_HANDOFF - AWAITING_USER_AUTH - AWAITING_REDIRECT_TO_APP timestamp: $ref: "#/components/schemas/Timestamp" HybridFlowServerAuthenticatedRequest: description: "" type: object required: - "consentId" - "Platform" - "osVersion" - "os" - timestamp properties: consentId: $ref: "#/components/schemas/ConsentId" Platform: $ref: "#/components/schemas/Platform" osVersion: type: string os: $ref: "#/components/schemas/OSType" timestamp: $ref: "#/components/schemas/Timestamp" HybridFlowServerRedirectToClientRequest: description: "" type: object required: - "consentId" - "uri_callback" - "Platform" - "osVersion" - "os" - "type" - "timestamp" properties: consentId: $ref: "#/components/schemas/ConsentId" uri_callback: $ref: "#/components/schemas/URI" Platform: $ref: "#/components/schemas/Platform" osVersion: type: string os: $ref: "#/components/schemas/OSType" type: type: string enum: - AUTHORISED - REJECTED timestamp: $ref: "#/components/schemas/Timestamp" HybridFlowServerRedirectTargetWithoutErrorsRequest: description: "" type: object required: - "consentId" - "Platform" - "osVersion" - "os" - timestamp properties: consentId: $ref: "#/components/schemas/ConsentId" Platform: $ref: "#/components/schemas/Platform" osVersion: type: string os: $ref: "#/components/schemas/OSType" timestamp: $ref: "#/components/schemas/Timestamp" HybridFlowServerRedirectTargetWithErrorsRequest: description: "" type: object required: - "consentId" - "Platform" - "osVersion" - "os" - "error" - "timestamp" properties: consentId: $ref: "#/components/schemas/ConsentId" Platform: type: string enum: - browser - app osVersion: type: string os: $ref: "#/components/schemas/OSType" error: type: string timestamp: $ref: "#/components/schemas/Timestamp" ClientReportRequest: description: Representa os dados que deverão ser enviados para a inclusão de reportes pelo lado do Client (iniciador da chamada). Informações adicionais sobre cada campo podem ser encontradas na documentação funcional em https://openfinancebrasil.atlassian.net/wiki/spaces/OF/pages/37879861/Reporte#Modelos-para-reportes-Private type: object required: - endpoint - statusCode - httpMethod - additionalInfo - timestamp - processTimespan - clientSSId - clientOrgId - serverOrgId - endpointUriPrefix - role properties: fapiInteractionId: description: UUID que identifica uma transação específica entre dois participantes. Esse dado pode ser encontrado no header x-fapi-interaction-id que é informado pelo Client e devolvido pelo Server. Mais informações em [Cabeçalhos HTTP](https://openbanking-brasil.github.io/areadesenvolvedor/#cabecalhos-http) na documentação do Open Finance Brasil. O envio dessa informação é obrigatório exceto nos casos ontem ela não esteja disponível, como por exemplo em respostas com status 5xx, ou em chamdas que terminaram por timeout onde o reporte tem que ser enviado mas sem esse atributo. Em todos os demais cenários, o envio é obrigatório. type: string format: uuid maxLength: 36 pattern: "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$" example: "d78fc4e5-37ca-4da3-adf2-9b082bf92280" endpoint: $ref: "#/components/schemas/PrivateReportEndpoints" statusCode: description: Status de retorno HTTP da solicitação. No caso de ocorrer um timeout client side preencher com um código 403 (conforme documentação ). type: integer format: int32 example: 200 minimum: 200 maximum: 599 httpMethod: description: Método HTTP da solicitação. type: string enum: ["GET", "POST", "PUT", "DELETE", "PATCH"] example: GET correlationId: description: ID de correlação que identifica uma sequência de chamadas inter-relacionadas no ecossistema. Diferente do fapiInteractionId que serve para identificar cada par request-response (interação), o identificador de correlação serve para ligar diferentes reportes quando estes representam uma jornada ou uma sequência de chamadas. Este valor é de livre provimento pelo reportador. type: string pattern: ^[- /:_.',0-9a-zA-Z]{0,100}$ maxLength: 100 example: "uGQHwNupARo7I9E2PLJZph18a0M9y7DcUe7ITt3DqUOJd9NVjnskxf2" additionalInfo: $ref: "#/components/schemas/AdditionalInfo" timestamp: description: Data/Hora UTC no formato ISO8601 com milissegundos (YYYY-MM-DDTHH:mm:ss.sssZ) do momento em que a chamada foi disparada, imediatamente antes do primeiro byte enviado na requisição. type: string format: date-time maxLength: 28 example: "2021-11-11T18:08:08.278Z" processTimespan: description: Tempo em milissegundos inteiros decorrido desde o registro do timestamp até a chegada do primeiro byte da resposta do server. type: integer format: int16 example: 120 clientSSId: description: Identificador do software statement de onde a chamada foi disparada. A PCM garante que foi esta orgId que obteve o token de acesso utilizado neste reporte. type: string format: uuid maxLength: 36 pattern: "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$" example: "84570da9-567b-4201-9b77-c715bc5bffde" clientOrgId: description: Identificador da organização **de onde** a chamada foi disparada type: string format: uuid maxLength: 36 pattern: "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$" example: "56411f7e-d58b-44a8-8a2b-ff326d3f2955" serverOrgId: description: Identificador da organização **para onde** a chamada foi feita type: string format: uuid maxLength: 36 pattern: "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$" example: "c1ca8e62-9d6f-4ea3-84f2-d66bc0a8f7dc" endpointUriPrefix: description: | Endereço do servidor de destino da chamada incluindo o prefixo quando houver. O formato do campo deverá ser o seguinte: `https://{host}/{prefixo}`, sendo: * `host`: endereço FQDN do servidor de destino * `prefixo`: toda a parte do path que vem antes da string `/open-banking` Exemplos: 1. Para uma requisição em `https://openbanking.instituicao-1.com.br/opbk/open-banking/products-services/v1/business-accounts`, o dado a ser enviado é `https://openbanking.instituicao-1.com.br/opbk`. 1. Para uma requisição em `https://openbanking.instituicao-2.com.br/open-banking/products-services/v1/business-accounts`, o dado a ser enviado é `https://openbanking.instituicao-1.com.br/`. Nos reportes relativos aos endpoints /token e /register este campo deverá conter a URL inteira do request. Exemplos: `https://oauth2.cartaodummy.opf.instituicao/as/token.oauth2` `https://instituicao.com.br/orgs/instituicao/reg` type: string pattern: ^[- /:_.',0-9a-zA-Z]{0,200}$ maxLength: 200 example: https://openbanking.instituicao-1.com.br/opbk role: description: ENUM indicando se o reporte que está sendo enviado apresenta a visão do server ou do client. Obrigatório valor "CLIENT" type: string enum: - CLIENT - SERVER ServerReportRequest: description: Representa os dados que deverão ser enviados para a inclusão de reportes pelo lado do Server (receptor da chamada). Informações adicionais sobre cada campo podem ser encontradas na documentação funcional em https://openfinancebrasil.atlassian.net/wiki/spaces/OF/pages/37879861/Reporte#Modelos-para-reportes-Private type: object required: - fapiInteractionId - endpoint - statusCode - httpMethod - timestamp - processTimespan - clientOrgId - serverOrgId - role properties: fapiInteractionId: description: UUID que identifica uma transação específica entre dois participantes. Esse dado pode ser encontrado no header x-fapi-interaction-id que é informado pelo Client e devolvido pelo Server. Mais informações em [Cabeçalhos HTTP](https://openbanking-brasil.github.io/areadesenvolvedor/#cabecalhos-http) na documentação do Open Finance Brasil. type: string format: uuid maxLength: 36 pattern: "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$" example: "d78fc4e5-37ca-4da3-adf2-9b082bf92280" endpoint: $ref: "#/components/schemas/PrivateReportEndpoints" statusCode: description: Status de retorno HTTP da solicitação. No caso de ocorrer um timeout client side preencher com um código 408 [conforme documentação](https://openfinancebrasil.atlassian.net/wiki/spaces/OF/pages/37879861/Reporte) type: integer format: int32 example: 200 minimum: 200 maximum: 599 httpMethod: description: Método HTTP da solicitação. type: string enum: ["GET", "POST", "PUT", "DELETE", "PATCH"] example: GET correlationId: description: Não utilizado pelo server. type: string pattern: ^[- /:_.',0-9a-zA-Z]{0,100}$ maxLength: 100 example: "uGQHwNupARo7I9E2PLJZph18a0M9y7DcUe7ITt3DqUOJd9NVjnskxf2" timestamp: description: Data/Hora UTC no formato ISO8601 com milissegundos (YYYY-MM-DDTHH:mm:ss.sssZ) do momento em que a chamada foi recebida, imediatamente antes do primeiro byte enviado na requisição. type: string format: date-time maxLength: 28 example: "2021-11-11T18:08:08.152Z" processTimespan: description: Tempo em milissegundos inteiros decorrido desde o registro do timestamp até a finalização do envio dos dados. type: integer format: int16 example: 120 clientOrgId: description: Identificador da organização **de onde** a chamada foi disparada type: string format: uuid maxLength: 36 pattern: "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$" example: "56411f7e-d58b-44a8-8a2b-ff326d3f2955" serverOrgId: description: Identificador da organização **para onde** a chamada foi feita. A PCM garante que foi esta orgId que obteve o token de acesso utilizado neste reporte. type: string format: uuid maxLength: 36 pattern: "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$" example: "c1ca8e62-9d6f-4ea3-84f2-d66bc0a8f7dc" additionalInfo: description: Não utilizado pelo server. role: description: ENUM indicando se o reporte que está sendo enviado apresenta a visão do server ou do client. Obrigatório valor "SERVER" type: string enum: - CLIENT - SERVER OpendataReportRequest: description: Modelo que representa os dados a serem enviados às APIs de dados abertos. Informações adicionais sobre cada campo podem ser encontradas na documentação funcional em https://openfinancebrasil.atlassian.net/wiki/spaces/OF/pages/37879861/Reporte#Reportes-OpenData. additionalProperties: false type: object required: - endpoint - statusCode - httpMethod - timestamp - processTimespan - additionalInfo properties: endpoint: $ref: "#/components/schemas/OpendataReportEndpoints" statusCode: description: Status de retorno HTTP da solicitação. type: integer format: int32 example: 200 minimum: 200 maximum: 599 httpMethod: description: Método HTTP da solicitação. type: string enum: ["GET"] example: GET timestamp: description: Data/Hora UTC no formato ISO8601 com milissegundos (YYYY-MM-DDTHH:mm:ss.sssZ) do momento em que a chamada foi recebida. type: string format: date-time maxLength: 28 example: "2021-11-11T18:08:08.421Z" processTimespan: description: Tempo em milissegundos inteiros decorrido desde o recebimento do request até o momento imediatamente anterior ao envio do primeiro byte da resposta. type: integer format: int16 example: 120 additionalInfo: $ref: "#/components/schemas/OpendataAdditionalInfo" ReportResponse: description: Representa os dados que serão retornados pelas operações de inclusão de reportes. additionalProperties: false required: - reportId - status type: object properties: reportId: description: Identificator único interno do reporte no formato UUID v4. type: string format: uuid maxLength: 36 pattern: "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$" example: "9a97c2df-b261-4fc2-aa66-d1b5168397da" status: $ref: "#/components/schemas/ReportStatus" correlationId: description: Retorna o valor do atributo `correlationId` informado na solicitação de inclusão de reporte sem alteração. type: string pattern: ^[- /:_.',0-9a-zA-Z]{0,100}$ maxLength: 100 example: "uGQHwNupARo7I9E2PLJZph18a0M9y7DcUe7ITt3DqUOJd9NVjnskxf2" message: description: Caso a solicitação contenha algum problema em seu formato, ou caso haja algum tipo de falha detectável no momento da requisição, esse campo trará detalhes sobre o erro ocorrido. Informações adicionais sobre os tipos de erros podem ser encontradas em https://openfinancebrasil.atlassian.net/wiki/spaces/OF/pages/46170119/Troubleshooting+-+PCM type: string pattern: ^[- /:_.',0-9a-zA-Z]{0,200}$ maxLength: 200 example: "Missing fields: 'fapiInteractionId', 'endpoint'" HybridFlowReportResponse: description: Representa os dados que serão retornados pelas operações de inclusão de reportes. additionalProperties: false required: - reportId type: object properties: reportId: description: Identificator único interno do reporte no formato UUID v4. type: string format: uuid maxLength: 36 pattern: "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$" example: "9a97c2df-b261-4fc2-aa66-d1b5168397da" ReportStatus: description: | Informa o status do registro de reporte. * **DISCARDED**: O status `DISCARDED` indica que o reporte que foi enviado pelo participante foi rejeitado pela PCM. O motivo do descarte será enviado junto com a resposta, podendo ser por conta de um reporte inválido ou por um erro no processamento. Não é possível modificar um reporte `DISCARDED`, portanto o reportador deverá corrigir o registro que apresentou erro e reenviar via POST. * **SINGLE**: O status `SINGLE` indica que o reporte em questão não tem uma contraparte. Ele é utilizado em casos onde a conciliação entre dois reportes não é possível. * **ACCEPTED**: O status `ACCEPTED` indica que a validação de formato do reporte não tem erros e este será enviado para processamento. * **UNPAIRED**: O status `UNPAIRED` significa que o reporte atual não possui uma correspondência em outro reporte através do atributo `fapiInteractionId`. Indica um reporte _divergente_. * **PAIRED_INCONSISTENT**: O status `PAIRED_INCONSISTENT` significa que o reporte corrente possui uma contraparte com o mesmo `fapiInteractionId`, mas os demais dados estão inconsistentes. Indica um reporte _divergente_. * **PAIRED**: Indica que o reporte tem uma contraparte com o mesmo `fapiInteractionId` e os demais dados estão conciliados. Representa o estado final desejado em um fluxo correto. type: string enum: - DISCARDED - SINGLE - ACCEPTED - UNPAIRED - PAIRED_INCONSISTENT - PAIRED ReportModel: description: Representa um reporte devidamente persistido. allOf: - $ref: "#/components/schemas/ClientReportRequest" - type: object properties: reportId: description: | Identificador único do registro criado na Platforma de Coleta de Métricas. type: string format: uuid maxLength: 36 pattern: "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$" pairedReportId: description: | Esse atributo indica o `reportId` do registro que forma uma correlação com o presente registro. Se essa informação existir, o status do registro atual deverá ser _PAIRED_ type: string format: uuid maxLength: 36 pattern: "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$" status: $ref: "#/components/schemas/ReportStatus" createdAt: description: | Carimbo do tempo do momento da criação do registro type: string format: date-time maxLength: 28 updatedAt: description: | Carimbo do tempo do momento da última atualização do registro type: string format: date-time maxLength: 28 OpendataReportModel: description: Representa um reporte devidamente persistido. allOf: - $ref: "#/components/schemas/OpendataReportRequest" - type: object properties: reportId: description: | Identificador único do registro criado na Platforma de Coleta de Métricas. type: string format: uuid maxLength: 36 pattern: "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$" createdAt: description: | Carimbo do tempo do momento da criação do registro type: string format: date-time maxLength: 28 updatedAt: description: | Carimbo do tempo do momento da última atualização do registro type: string format: date-time maxLength: 28 PrivateReportEndpoints: description: | Identificação do endpoint que foi utilizado na transação reportada. A identificação do endpoint deve estar entre as entradas desse enum para ser considerado válido. Nesse campo não deve ser utilizado o _path_ da requisição original, uma vez que ao comparar com os valores dessa enum, ele não será considerado válido. Exemplo: 1. Caso uma chamada à um endpoint com o **path** `/open-banking/credit-cards-accounts/v1/accounts/123456789/transactions` tenha sido feita, o valor a ser enviado no reporte é `/open-banking/credit-cards-accounts/v1/accounts/{creditCardAccountId}/transactions`, que é o identificador desse endpoint no enum. Nesse caso, o dado real da parte variável do _path_ não deverá ser enviado. type: string example: /open-banking/consents/v2/consents enum: - "/token" - "/register" - "/register/{clientId}" - "/introspection" - "/pushed-authorization-request" - "/revocation" - "/open-banking/accounts/v2/accounts" - "/open-banking/accounts/v2/accounts/{accountId}" - "/open-banking/accounts/v2/accounts/{accountId}/balances" - "/open-banking/accounts/v2/accounts/{accountId}/overdraft-limits" - "/open-banking/accounts/v2/accounts/{accountId}/transactions" - "/open-banking/accounts/v2/accounts/{accountId}/transactions-current" - "/open-banking/consents/v2/consents" - "/open-banking/consents/v2/consents/{consentId}" - "/open-banking/credit-cards-accounts/v2/accounts" - "/open-banking/credit-cards-accounts/v2/accounts/{creditCardAccountId}" - "/open-banking/credit-cards-accounts/v2/accounts/{creditCardAccountId}/bills" - "/open-banking/credit-cards-accounts/v2/accounts/{creditCardAccountId}/bills/{billId}/transactions" - "/open-banking/credit-cards-accounts/v2/accounts/{creditCardAccountId}/limits" - "/open-banking/credit-cards-accounts/v2/accounts/{creditCardAccountId}/transactions" - "/open-banking/credit-cards-accounts/v2/accounts/{creditCardAccountId}/transactions-current" - "/open-banking/customers/v2/business/financial-relations" - "/open-banking/customers/v2/business/identifications" - "/open-banking/customers/v2/business/qualifications" - "/open-banking/customers/v2/personal/financial-relations" - "/open-banking/customers/v2/personal/identifications" - "/open-banking/customers/v2/personal/qualifications" - "/open-banking/financings/v2/contracts" - "/open-banking/financings/v2/contracts/{contractId}" - "/open-banking/financings/v2/contracts/{contractId}/payments" - "/open-banking/financings/v2/contracts/{contractId}/scheduled-instalments" - "/open-banking/financings/v2/contracts/{contractId}/warranties" - "/open-banking/invoice-financings/v2/contracts" - "/open-banking/invoice-financings/v2/contracts/{contractId}" - "/open-banking/invoice-financings/v2/contracts/{contractId}/payments" - "/open-banking/invoice-financings/v2/contracts/{contractId}/scheduled-instalments" - "/open-banking/invoice-financings/v2/contracts/{contractId}/warranties" - "/open-banking/loans/v2/contracts" - "/open-banking/loans/v2/contracts/{contractId}" - "/open-banking/loans/v2/contracts/{contractId}/payments" - "/open-banking/loans/v2/contracts/{contractId}/scheduled-instalments" - "/open-banking/loans/v2/contracts/{contractId}/warranties" - "/open-banking/payments/v1/consents" - "/open-banking/payments/v1/consents/{consentId}" - "/open-banking/payments/v1/pix/payments" - "/open-banking/payments/v1/pix/payments/{paymentId}" - "/open-banking/payments/v2/consents" - "/open-banking/payments/v2/consents/{consentId}" - "/open-banking/payments/v2/pix/payments" - "/open-banking/payments/v2/pix/payments/{paymentId}" - "/open-banking/resources/v2/resources" - "/open-banking/unarranged-accounts-overdraft/v2/contracts" - "/open-banking/unarranged-accounts-overdraft/v2/contracts/{contractId}" - "/open-banking/unarranged-accounts-overdraft/v2/contracts/{contractId}/payments" - "/open-banking/unarranged-accounts-overdraft/v2/contracts/{contractId}/scheduled-instalments" - "/open-banking/unarranged-accounts-overdraft/v2/contracts/{contractId}/warranties" - "/open-banking/payments/v3/consents" - "/open-banking/payments/v3/consents/{consentId}" - "/open-banking/payments/v3/pix/payments" - "/open-banking/payments/v3/pix/payments/{paymentId}" OpendataReportEndpoints: description: | Identificação do endpoint que foi utilizado na chamada da api de dados abertos. A identificação do endpoint deve estar entre as entradas desse enum para ser considerado válido. type: string example: "/open-banking/channels/v1/electronic-channels" enum: - "/open-banking/products-services/v1/personal-accounts" - "/open-banking/products-services/v1/business-accounts" - "/open-banking/products-services/v1/personal-loans" - "/open-banking/products-services/v1/business-loans" - "/open-banking/products-services/v1/personal-financings" - "/open-banking/products-services/v1/business-financings" - "/open-banking/products-services/v1/personal-invoice-financings" - "/open-banking/products-services/v1/business-invoice-financings" - "/open-banking/products-services/v1/personal-credit-cards" - "/open-banking/products-services/v1/business-credit-cards" - "/open-banking/products-services/v1/personal-unarranged-account-overdraft" - "/open-banking/products-services/v1/business-unarranged-account-overdraft" - "/open-banking/channels/v1/branches" - "/open-banking/channels/v1/electronic-channels" - "/open-banking/channels/v1/phone-channels" - "/open-banking/channels/v1/banking-agents" - "/open-banking/channels/v1/shared-automated-teller-machines" - "/open-banking/capitalization-bonds/v1/bonds" - "/open-banking/investments/v1/funds" - "/open-banking/exchange/v1/online-rates" - "/open-banking/exchange/v1/vet-values" - "/open-banking/acquiring-services/v1/personals" - "/open-banking/acquiring-services/v1/businesses" - "/open-banking/pension/v1/risk-coverages" - "/open-banking/insurance/v1/automotives" - "/open-banking/insurance/v1/homes" - "/open-banking/insurance/v1/personals" AdditionalInfo: description: Informações adicionais sobre o reporte deste endpoint/método. Possui característica variável. As regras de preenchimento estão na documentação funcional em https://openfinancebrasil.atlassian.net/wiki/spaces/OF/pages/37879861/Reporte#additionalInfo. Atenção especial na tabela Excel com a listagem de endpoints em https://openfinancebrasil.atlassian.net/wiki/download/attachments/37879861/Tabela%20additionalInfo%20%E2%80%93%20campos%20contexto%20e%20obrigatoriedade%20(cliente%20server).xlsx?api=v2. type: object properties: consentId: description: Deve ser preenchido com a mesma string obtida no campo `.data.consentId` retornado após a chamada inicial na API "POST /consent". *Ao reportar o uso de um endpoint /token, o identificador único de consentimento só será reportado nos casos em que "grant_type" é do tipo "authorization_code" ou do tipo "refresh_token", uma vez que esta informação de consentId é inexistente quando "grant_type" é do tipo type: string personType: description: Deve ser preenchida baseado no tipo de pessoa responsável pelo consentimento. Deverá ser obserdado se `.data.businessEntity` estiver preenchido no payload, se estiver então preencher com "PJ", se não estiver então preencher com "PF" type: string localInstrument: description: Deve ser preenchido com a mesma string informada no payload ".data.localInstrument" type: string status: description: Deve ser preenchido com a mesma string obtida no ".data.status" type: string clientIp: description: Deve ser preenchido com o Endereço IPv4 ou IPv6 do client que fez a requisição type: string rejectReason: description: Deve ser preenchido com a mesma string obtida no ".data.rejectionReason.code" type: string errorCodes: description: Caso o HTTP Code seja 4XX ou 5XX, esse campo deve ser preenchido com a lista das strings obtidas em ".errors[].code" . Não havendo string, deve ser enviada uma lista vazia. type: string webhookEnable: description: Deve ser preenchido com o valor booleano TRUE caso haja pelo menos um item indicado na lista do campo ".webhook_uris" no payload, caso contrário deverá ser preenchido com o valor booleano FALSE type: string webhookInteractionId: description: Caso o GET esteja sendo feito após o estímulo do webhook, o x-webhook-interaction-id deverá ser indicado type: string enrollmentId: description: Deve ser preenchido com a mesma string obtida no campo `.data.enrollmentId` retornado após a chamada inicial na API "POST /enrollments". *Ao reportar o uso de um endpoint /token, o identificador único de consentimento só será reportado nos casos em que "grant_type" é do tipo "authorization_code" ou do tipo "refresh_token", uma vez que esta informação de enrollmentId é inexistente quando "grant_type" é do tipo "client_credentials". type: string authenticatorAttachment: description: Deve ser preenchido com a mesma string definida em ".data.authenticatorAttachment". Não havendo string, deve ser explicitamente enviada esse additionalInfo como sendo uma string vazia. type: string platform: description: Deve ser preenchido com a mesma string definida em ".data.platform" type: string rp: description: Deve ser preenchido com a mesma string definida em ".data.rp" type: string rejectionReasonCode: description: Deve ser preenchido com a mesma string obtida no ".data.rejectionReason.code" type: string rejectionReasonDetail: description: Deve ser preenchido com a mesma string obtida no ".data.rejectionReason.detail" type: string authorisationFlow: description: Deve ser preenchido com a mesma string obtida no ".data.authorisationFlow" type: string dropReason: description: | 1. O campo dropReason deve ser adicionado nas informações do campo additionalInfo que deverá ser enviado no reporte do provedor do serviço consumido (papel SERVER) 2. O campo deve ser preenchido como “NO_CREDENTIAL" caso o CPF/CNPJ não seja cliente ou “NONE” caso contrário. 3. Neste contexto define-se como cliente o CPF/CNPJ que possui credencial autenticadora para prosseguir no fluxo monitorado. 4. O reporte deverá ser feito por todos os transmissores de dados e detentoras de conta. 5. O provedor do serviço deverá verificar se o CPF/CNPJ informado na criação do consentimento é seu cliente antes de enviar o reporte para a PCM. type: string enum: - POST /open-banking/consents/v2/consents​ - POST /open-banking/payments/v3/consents​ - POST /open-banking/payments/v4/consents​ - POST /open-banking/enrollments/v1/enrollments​ - POST /open-banking/automatic-payments/v1​/recurring-consents​ OpendataAdditionalInfo: description: Informações adicionais sobre o reporte deste endpoint/método. Possui característica variável. As regras de preenchimento estão na documentação funcional em https://openfinancebrasil.atlassian.net/wiki/spaces/OF/pages/37879861/Reporte#additionalInfo. Atenção especial na tabela Excel com a listagem de endpoints em https://openfinancebrasil.atlassian.net/wiki/download/attachments/37879861/Tabela%20additionalInfo%20%E2%80%93%20campos%20contexto%20e%20obrigatoriedade%20(cliente%20server).xlsx?api=v2. type: object properties: {} GenericError: description: Representa uma resposta de erro genérica. type: object additionalProperties: false properties: message: type: string pattern: ^[- /:_.',0-9a-zA-Z]{0,200}$ maxLength: 200 EmptyObject: description: Representa um objeto sem propriedades previamente definidas type: object additionalProperties: false example: {} securitySchemes: PCMAccessToken: type: http scheme: bearer bearerFormat: JWT responses: Default401Unauthorized: description: Ocorre quando uma requisição não é autorizada pelo gateway, e acontece quando o token não é enviado ou está inválido. content: application/json: schema: $ref: "#/components/schemas/GenericError" examples: NotAuthorized: value: message: "Unauthorized" Default403Forbidden: description: Ocorre quando um cliente já previamente identificado (autenticado) não é autorizado a acessar um determinado recurso. content: application/json: schema: $ref: "#/components/schemas/GenericError" examples: Forbidden: value: message: "Forbidden" Default404NotFound: description: Ocorre quando o reporte referenciado nao existe na base de dados. content: application/json: schema: $ref: "#/components/schemas/GenericError" examples: Forbidden: value: message: "Not Found" Default406NotAcceptable: description: Ocorre quando um cliente espera uma resposta diferente de application/json usando o header `Accept` content: application/json: schema: $ref: "#/components/schemas/GenericError" examples: NotAcceptable: value: message: "Content type not accepted" Default415UnsupportedMediaType: description: Ocorre quando uma requisição envia um Content Type diferente de application/json content: application/json: schema: $ref: "#/components/schemas/GenericError" examples: NotAcceptable: value: message: "Unsupported Media Type" Default429TooManyRequests: description: Ocorre quando o servidor atinge o limite de requisições (atualmente, 300 req/s). content: application/json: schema: $ref: "#/components/schemas/GenericError" examples: NotAcceptable: value: message: "Too Many Requests" Default500InternalServerError: description: É devolvido quando ocorre um erro não identificado no servidor content: application/json: schema: $ref: "#/components/schemas/GenericError" examples: InternalServerError: value: message: "Internal Server Error"