code: public static JobV3 poll(Retrofit retrofit, String job_id) {
          Jobs jobsService = retrofit.create(Jobs.class);
          Response<JobsV3> jobsResponse = null;
  
          int retries = 3;
          JobsV3 jobs = null;
          do {
              try {
                  jobsResponse = jobsService.fetch(job_id).execute();
              }
              catch (IOException e) {
                  System.err.println("Caught exception: " + e);
              }
              if (! jobsResponse.isSuccessful())
                  if (retries-- > 0)
                     continue;
                  else
                      throw new RuntimeException("/3/Jobs/{job_id} failed 3 times.");
  
              jobs = jobsResponse.body();
              if (null == jobs.jobs || jobs.jobs.length != 1)
                  throw new RuntimeException("Failed to find Job: " + job_id);
              if (! "RUNNING".equals(jobs.jobs[0].status)) try { Thread.sleep(100); } catch (InterruptedException e) {} // wait 100mS
          } while ("RUNNING".equals(jobs.jobs[0].status));
          return jobs.jobs[0];
      }
docs: KeysColSpecifiers get sent as Strings and returned as objects also containing a list of Frames that the col must be a member of,
  so they need a custom GSON serializer.
  private static class ColSpecifierSerializer implements JsonSerializer<ColSpecifierV3> {
  public JsonElement serialize(ColSpecifierV3 cs, Type t, JsonSerializationContext context) {
  return new JsonPrimitive(cs.column_name);
  }
  }