Resumo
Na criação de recorrência do Pix Automático (POST /rec), o campo loc é serializado a partir de TACBrPIXRecSolicitadaBase.loc, que está declarado como Integer.
Quando o PSP retorna um id de location maior que 2.147.483.647 (Int32), o valor é truncado para 32 bits e enviado negativo, fazendo o PSP recusar a requisição.
O id de location do Itaú tem 19 dígitos (ex.: 7587166705779689739), então o problema é 100% reproduzível nesse PSP.
Evidência
Resposta do POST /locrec (id da location gerada pelo PSP):
{"id":7587166705779689739,"location":"api.itau/rec/694b07eb-...","criacao":"2026-07-15T19:09:32.992Z","idRec":null}
Corpo do POST /rec montado pelo ACBr logo em seguida:
{"politicaRetentativa":"PERMITE_3R_7D","vinculo":{...},"calendario":{...},"loc":-1649719029}
O loc foi de 7587166705779689739 para -1649719029, que é exatamente o truncamento para inteiro de 32 bits com sinal (os 32 bits baixos de 7587166705779689739 = -1649719029).
O PSP então responde:
HTTP/1.1 401 Unauthorized
{"title":"Acesso Negado","status":401,"detail":"Não autorizado. Verifique se os parâmetros de acesso estão válidos..."}
Como replicar
Usar um PSP cujo /locrec retorne um id de location maior que Int32 (o Itaú sempre retorna, 19 dígitos).
Chamar CriarLocation (epLocRec) e em seguida CriarRecorrencia (epRec) com RecorrenciaSolicitada.loc := LocationGerada.id.
Observar no log (NivelLog alto) o Req.Body do /rec: o loc sai negativo.
Causa
Em ACBrPIXSchemasRec.pas, classe TACBrPIXRecSolicitadaBase:
private
fLoc: Integer; // <-- trunca
...
property loc: Integer read fLoc write fLoc; // <-- trunca
Há uma inconsistência interna:
no ACBrPIXSchemasLocation.pas o campo id da location já é Int64 (leitura correta), mas o loc da recorrência (escrita) é Integer.
Ou seja, o valor chega inteiro na leitura e é cortado ao ser atribuído/serializado na escrita.
Correção sugerida
Em ACBrPIXSchemasRec.pas, TACBrPIXRecSolicitadaBase:
private
fLoc: Int64; // era Integer
...
property loc: Int64 read fLoc write fLoc; // era Integer
Resultado após a correção
Mesmo cenário, com o campo já como Int64 — loc vai íntegro (batendo com o id retornado no /locrec
{"id":1570237648687511524,"location":"api.itau/rec/ea35652d-...","idRec":null}
...
Req.Body: {"politicaRetentativa":"PERMITE_3R_7D","valor":{...},"vinculo":{...},"calendario":{...},"loc":1570237648687511524}
A mudança é retrocompatível (Int64 comporta todo Integer) e alinha o tipo da escrita com o da leitura (TACBrPIXLocation.id).