Processing project information is much better via API than query since the API exposes the system IDs where query does not. Ran into a speed bump where when utilizing custom fields... adjusting an associated code value does not bubble up as a change to the project, although it is indirectly. This has caused the need to query/process all projects and associated custom fields "just in case" something has changed. A 30 second processing time to 20+ minutes for this reason.