Questo è un problema comune che ho incontrato me stesso molte volte. Ho finito per scendere la rotta "usa solo un numero per l'id", il che significa che non è così brutto per i client vedere quegli UUID.
L'unico altro modo, come hai già eluso, è quello di nascondere quell'ID dietro qualche tipo di query, alla quale dovrai fornire i parametri per recuperare l'UUID corretto, tuttavia, ciò significa che puoi anche stai usando quei parametri come chiave primaria per la tabella!
Direi che non c'è modo di fare REST (cioè il trasferimento di stato di un modello) senza essere in grado di identificare l'istanza di cui si sta eseguendo il REST, quindi avrai bisogno di una chiave, qualunque sia la forma che assume la chiave.
Se la tua preoccupazione è dovuta alla sicurezza, vedo il problema così com'è nel codice di convalida dei messaggi del tuo server, non che il client veda Id. Se un hacker vuole caricare alcuni dati dalla tua tabella, non avranno bisogno di id per farlo. E anche tu dovresti convalidare le richieste, quindi nessuna roba oscura arriva comunque ai tuoi livelli aziendali, ad esempio l'autenticazione e l'autorizzazione dei messaggi.
Per tornare alla tua domanda:
"accessible through REST, so I don't want to expose the primary key"
Penso che sia l'opposto, è necessario esporre la chiave primaria per fare REST.
EDIT: come sottolineato da @Murph, in realtà offre agli hacker una migliore possibilità se dai Id al cliente - non lo sapevo. Potrebbe essere che altre risposte qui (sto guardando il più breve che dice di crittografare la chiave) potrebbero essere più corrette per la tua situazione. Modifica 2: Sembra che gli UUID non siano più sicuri degli Ints ...