<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mostafa Mansour</title>
    <description>The latest articles on DEV Community by Mostafa Mansour (@mostafamansour1).</description>
    <link>https://dev.to/mostafamansour1</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4020937%2Ff17d7625-3b10-4122-9971-9f4ede69c8d9.png</url>
      <title>DEV Community: Mostafa Mansour</title>
      <link>https://dev.to/mostafamansour1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mostafamansour1"/>
    <language>en</language>
    <item>
      <title>"The 6 Pagination Bugs That Eat Oracle Fusion REST API Integrations"</title>
      <dc:creator>Mostafa Mansour</dc:creator>
      <pubDate>Sun, 19 Jul 2026 07:04:18 +0000</pubDate>
      <link>https://dev.to/mostafamansour1/the-6-pagination-bugs-that-eat-oracle-fusion-rest-api-integrations-38i8</link>
      <guid>https://dev.to/mostafamansour1/the-6-pagination-bugs-that-eat-oracle-fusion-rest-api-integrations-38i8</guid>
      <description>&lt;p&gt;Every collection GET against an Oracle Fusion REST API is paginated whether you ask for it or not. Call &lt;code&gt;GET /workers&lt;/code&gt;, treat the response as "all workers," and you silently got the first &lt;strong&gt;25 rows&lt;/strong&gt; — nothing warns you that thousands more exist. Here are the six pagination bugs I keep seeing in Fusion integrations, and the loop that avoids all of them. Replace &lt;code&gt;acme.fa.us2.oraclecloud.com&lt;/code&gt; with your pod; all sample data is anonymized.&lt;/p&gt;

&lt;h2&gt;
  
  
  The response wrapper
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hasMore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"limit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"offset"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;count&lt;/code&gt; is this page's size, not the total. &lt;code&gt;hasMore&lt;/code&gt; is your loop condition. &lt;code&gt;limit&lt;/code&gt; is what the server &lt;strong&gt;actually used&lt;/strong&gt; — it can override what you asked for. &lt;code&gt;offset&lt;/code&gt; is 0-based.&lt;/p&gt;

&lt;h2&gt;
  
  
  The six bugs
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. First 25 rows only.&lt;/strong&gt; No &lt;code&gt;limit&lt;/code&gt; sent, default applied, &lt;code&gt;hasMore&lt;/code&gt; ignored. The classic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Off-by-one offset.&lt;/strong&gt; &lt;code&gt;offset&lt;/code&gt; is 0-based; a 1-based assumption (a real bug in identity-management connectors) duplicates or drops one record at every page boundary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Silent limit override.&lt;/strong&gt; The cap is 500 on most resources. Ask for &lt;code&gt;limit=1000&lt;/code&gt;, get 500, increment offset by 1000 → every second page skipped. Always increment by the &lt;strong&gt;response's&lt;/strong&gt; &lt;code&gt;limit&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Unstable ordering.&lt;/strong&gt; No &lt;code&gt;orderBy&lt;/code&gt; means rows can shift between calls — nightly syncs "lose" records nondeterministically. Always sort on a stable unique key (&lt;code&gt;PersonId&lt;/code&gt;, &lt;code&gt;InvoiceId&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. totalResults on every page.&lt;/strong&gt; It forces an extra count query per request. Fetch it once with &lt;code&gt;limit=1&lt;/code&gt;, then run the loop without it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Restarting after a 429.&lt;/strong&gt; A 500-per-page loop over a big resource is thousands of calls. Back off and resume from the saved &lt;code&gt;offset&lt;/code&gt;; don't start over.&lt;/p&gt;

&lt;h2&gt;
  
  
  The loop that avoids all six
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;BASE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'https://acme.fa.us2.oraclecloud.com/fscmRestApi/resources/11.13.18.05/invoices'&lt;/span&gt;
&lt;span class="nv"&gt;LIMIT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;500
&lt;span class="nv"&gt;OFFSET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0
&lt;span class="k"&gt;while&lt;/span&gt; :&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;&lt;span class="nv"&gt;PAGE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s1"&gt;'integration.user@example.com:YourPassword'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$BASE&lt;/span&gt;&lt;span class="s2"&gt;?limit=&lt;/span&gt;&lt;span class="nv"&gt;$LIMIT&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;offset=&lt;/span&gt;&lt;span class="nv"&gt;$OFFSET&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;onlyData=true&amp;amp;orderBy=InvoiceId"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PAGE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.items[].InvoiceNumber'&lt;/span&gt;
  &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PAGE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | jq &lt;span class="s1"&gt;'.hasMore'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"true"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;break
  &lt;/span&gt;&lt;span class="nv"&gt;OFFSET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;OFFSET &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PAGE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | jq &lt;span class="s1"&gt;'.limit'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;onlyData=true&lt;/code&gt; strips per-item HATEOAS links and shrinks payloads dramatically — always use it when iterating.&lt;/p&gt;

&lt;h2&gt;
  
  
  Filter before you paginate
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;limit&lt;/code&gt;/&lt;code&gt;offset&lt;/code&gt; compose with &lt;code&gt;q&lt;/code&gt; and finders. A &lt;a href="https://opalapi.dev/blog/oracle-fusion-rest-api-q-parameter/" rel="noopener noreferrer"&gt;q filter&lt;/a&gt; that cuts 48,000 rows to 3,000 saves you 90 pages before pagination starts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s1"&gt;'integration.user@example.com:YourPassword'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s1"&gt;'https://acme.fa.us2.oraclecloud.com/hcmRestApi/resources/11.13.18.05/workers?q=assignments.AssignmentStatusType=%27ACTIVE%27&amp;amp;limit=500&amp;amp;offset=0&amp;amp;onlyData=true&amp;amp;orderBy=PersonId'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which fields are filterable is endpoint-specific — &lt;a href="https://opalapi.dev/apis/hcm/workers/" rel="noopener noreferrer"&gt;&lt;code&gt;/workers&lt;/code&gt;&lt;/a&gt; alone has 307 queryable fields, and the free field-level reference at &lt;a href="https://opalapi.dev/apis/" rel="noopener noreferrer"&gt;opalapi.dev/apis&lt;/a&gt; lists q fields, finders, and child resources for the top HCM and FSCM endpoints.&lt;/p&gt;

&lt;h2&gt;
  
  
  Expanded children paginate too
&lt;/h2&gt;

&lt;p&gt;From REST framework v3, an expanded child returns a collection wrapper with its own &lt;code&gt;hasMore&lt;/code&gt; — and any child with &lt;strong&gt;more than 500 items isn't expanded at all&lt;/strong&gt; (you get a &lt;code&gt;links&lt;/code&gt; entry instead). For large children (assignments across history), skip &lt;code&gt;expand&lt;/code&gt; and paginate the child URI directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s1"&gt;'integration.user@example.com:YourPassword'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s1"&gt;'https://acme.fa.us2.oraclecloud.com/hcmRestApi/resources/11.13.18.05/workers/00020000000EACED.../child/assignments?limit=100&amp;amp;offset=0&amp;amp;onlyData=true'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://opalapi.dev/blog/oracle-fusion-rest-api-pagination/" rel="noopener noreferrer"&gt;OPAL blog&lt;/a&gt; — the full version covers totalResults costs, hasMore-vs-row-security gotchas, and framework-version differences. OPAL is a free offline desktop explorer for 59,000+ Oracle Fusion endpoints: &lt;a href="https://opalapi.dev/" rel="noopener noreferrer"&gt;opalapi.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>oracle</category>
      <category>api</category>
      <category>rest</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>"Oracle FSCM REST API: What Transfers From HCM and What Doesn't"</title>
      <dc:creator>Mostafa Mansour</dc:creator>
      <pubDate>Fri, 17 Jul 2026 19:49:53 +0000</pubDate>
      <link>https://dev.to/mostafamansour1/oracle-fscm-rest-api-what-transfers-from-hcm-and-what-doesnt-4c4p</link>
      <guid>https://dev.to/mostafamansour1/oracle-fscm-rest-api-what-transfers-from-hcm-and-what-doesnt-4c4p</guid>
      <description>&lt;p&gt;If you've integrated with Oracle Fusion HCM (&lt;code&gt;/hcmRestApi/&lt;/code&gt;), the Financials and Supply Chain surface (&lt;code&gt;/fscmRestApi/&lt;/code&gt;) is 90% the same API with a different catalog. Here's the 10% that matters, with working examples. Replace &lt;code&gt;acme.fa.us2.oraclecloud.com&lt;/code&gt; with your pod; all sample data is anonymized.&lt;/p&gt;

&lt;h2&gt;
  
  
  Same host, different path segment
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HCM:  https://acme.fa.us2.oraclecloud.com/hcmRestApi/resources/11.13.18.05/workers
FSCM: https://acme.fa.us2.oraclecloud.com/fscmRestApi/resources/11.13.18.05/invoices
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;q&lt;/code&gt;, finders, &lt;code&gt;expand&lt;/code&gt;, &lt;code&gt;fields&lt;/code&gt;, and &lt;code&gt;limit&lt;/code&gt;/&lt;code&gt;offset&lt;/code&gt;/&lt;code&gt;hasMore&lt;/code&gt; pagination all behave identically. Auth is the same too — Basic over TLS for dev, OAuth 2.0 for production. A 403 on an FSCM resource almost always means a missing Financials/SCM duty role, not a wrong URL.&lt;/p&gt;

&lt;h2&gt;
  
  
  Know how filterable a resource is before you call it
&lt;/h2&gt;

&lt;p&gt;These numbers come from the real Oracle OpenAPI spec:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Resource&lt;/th&gt;
&lt;th&gt;q fields&lt;/th&gt;
&lt;th&gt;Finders&lt;/th&gt;
&lt;th&gt;Children&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://opalapi.dev/apis/fscm/invoices/" rel="noopener noreferrer"&gt;&lt;code&gt;/invoices&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;88&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://opalapi.dev/apis/fscm/expenses/" rel="noopener noreferrer"&gt;&lt;code&gt;/expenses&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;110&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://opalapi.dev/apis/fscm/payables-payments/" rel="noopener noreferrer"&gt;&lt;code&gt;/payablesPayments&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;82&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/payablesInterfaceInvoices&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;186&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That last row is the gotcha pattern: some resources are all q fields and no finders, others the reverse. Checking first saves you from writing a filter the endpoint can't serve.&lt;/p&gt;

&lt;h2&gt;
  
  
  q filters that actually work on /invoices
&lt;/h2&gt;

&lt;p&gt;Real queryable fields include &lt;code&gt;BusinessUnit&lt;/code&gt;, &lt;code&gt;ApprovalStatus&lt;/code&gt;, &lt;code&gt;AmountPaid&lt;/code&gt;, &lt;code&gt;AccountingDate&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /fscmRestApi/resources/11.13.18.05/invoices
    ?q=AmountPaid=0 and BaseAmount&amp;gt;10000 and AccountingDate&amp;gt;'2026-01-01'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lowercase &lt;code&gt;and&lt;/code&gt;/&lt;code&gt;or&lt;/code&gt;, single quotes on strings only, URL-encode exactly once.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prefer finders when they exist
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /fscmRestApi/resources/11.13.18.05/payablesPayments
    ?finder=PrimaryKey;CheckId=300000001234567
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;/expenses&lt;/code&gt; ships &lt;code&gt;FindCCTransactions&lt;/code&gt; and friends; &lt;code&gt;/receivablesInvoices&lt;/code&gt; has &lt;code&gt;invoiceSearch&lt;/code&gt;. Finders map to indexed view criteria on Oracle's side — consistently faster than the equivalent &lt;code&gt;q&lt;/code&gt; on large tables.&lt;/p&gt;

&lt;h2&gt;
  
  
  The FSCM-specific 404
&lt;/h2&gt;

&lt;p&gt;Resource names are camelCase and case-sensitive: &lt;code&gt;payablesPayments&lt;/code&gt; works, &lt;code&gt;payablespayments&lt;/code&gt; is a 404 that looks like a valid path. This one costs people hours.&lt;/p&gt;




&lt;p&gt;Full guide with expand examples, pagination, and the complete error table: &lt;a href="https://opalapi.dev/blog/oracle-fscm-rest-api/" rel="noopener noreferrer"&gt;Oracle FSCM REST API: Base URL, Key Endpoints, and Working Examples&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I build &lt;a href="https://opalapi.dev/" rel="noopener noreferrer"&gt;OPAL&lt;/a&gt;, an offline Oracle Fusion API explorer — 59,000+ HCM/FSCM endpoints searchable without internet, with visual q filter and finder builders and a full &lt;a href="https://opalapi.dev/apis/" rel="noopener noreferrer"&gt;endpoint reference&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>oracle</category>
      <category>api</category>
      <category>rest</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>"6 Oracle HCM REST API Requests I Copy-Paste Every Week"</title>
      <dc:creator>Mostafa Mansour</dc:creator>
      <pubDate>Tue, 14 Jul 2026 08:11:44 +0000</pubDate>
      <link>https://dev.to/mostafamansour1/6-oracle-hcm-rest-api-requests-i-copy-paste-every-week-2j42</link>
      <guid>https://dev.to/mostafamansour1/6-oracle-hcm-rest-api-requests-i-copy-paste-every-week-2j42</guid>
      <description>&lt;p&gt;Oracle's HCM REST API docs describe every endpoint, but they rarely show a complete working request next to the response you'll actually get. Here are the six calls I reach for constantly — adapt the pod hostname (&lt;code&gt;acme.fa.us2.oraclecloud.com&lt;/code&gt;) and credentials, everything else works as-is. All sample data is anonymized; Basic Auth for readability (use OAuth 2.0 in production).&lt;/p&gt;

&lt;p&gt;Base URL for everything below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://acme.fa.us2.oraclecloud.com/hcmRestApi/resources/11.13.18.05
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  1. Get workers, paginated properly
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"integration.user@example.com:password"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://acme.fa.us2.oraclecloud.com/hcmRestApi/resources/11.13.18.05/workers?limit=10"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Always pass &lt;code&gt;limit&lt;/code&gt; (default page size is 25, max 500). The response's &lt;code&gt;hasMore: true&lt;/code&gt; tells you to keep going — increment &lt;code&gt;offset&lt;/code&gt; until it flips to &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. One worker by person number with &lt;code&gt;q&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"user:pass"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://acme.fa.us2.oraclecloud.com/hcmRestApi/resources/11.13.18.05/workers?q=PersonNumber='100001'"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;String values in &lt;code&gt;q&lt;/code&gt; must be single-quoted; numbers don't. If you get "The query parameter is invalid", the field probably isn't queryable on that endpoint — workers alone has &lt;a href="https://opalapi.dev/apis/hcm/workers/" rel="noopener noreferrer"&gt;307 queryable fields&lt;/a&gt;, and it's never all of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Range filter, URL-encoded once
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"user:pass"&lt;/span&gt; &lt;span class="nt"&gt;--get&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data-urlencode&lt;/span&gt; &lt;span class="s2"&gt;"q=PersonNumber&amp;gt;='100001' and PersonNumber&amp;lt;='100500'"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://acme.fa.us2.oraclecloud.com/hcmRestApi/resources/11.13.18.05/workers"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two rules: &lt;code&gt;and&lt;/code&gt;/&lt;code&gt;or&lt;/code&gt; lowercase, and encode the expression exactly once (&lt;code&gt;--data-urlencode&lt;/code&gt; does this). Double-encoding is the classic cause of silently empty results.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Finder instead of q — faster lookups
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"user:pass"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://acme.fa.us2.oraclecloud.com/hcmRestApi/resources/11.13.18.05/workers?finder=findByPersonId;PersonId=300000001234567"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Syntax is &lt;code&gt;finder=&amp;lt;name&amp;gt;;&amp;lt;bindVar&amp;gt;=&amp;lt;value&amp;gt;&lt;/code&gt; — semicolon, not &lt;code&gt;&amp;amp;&lt;/code&gt;. Finders are pre-built indexed queries; &lt;code&gt;findByPersonId&lt;/code&gt; beats the equivalent &lt;code&gt;q&lt;/code&gt; filter every time. Bonus: &lt;code&gt;findReports;ManagerPersonId=...&lt;/code&gt; answers "who reports to this manager" with zero assignment traversal.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Cut the payload with &lt;code&gt;fields&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"user:pass"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://acme.fa.us2.oraclecloud.com/hcmRestApi/resources/11.13.18.05/workers?q=PersonNumber='100001'&amp;amp;fields=PersonId,PersonNumber,DateOfBirth"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Routinely an 80–90% response-size cut on collections. The single easiest performance win in the whole API.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Inline child resources with &lt;code&gt;expand&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"user:pass"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://acme.fa.us2.oraclecloud.com/hcmRestApi/resources/11.13.18.05/workers?q=PersonNumber='100001'&amp;amp;expand=names,workRelationships.assignments"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Names, emails, and assignments are children — by default you only get links. Dot notation reaches nested children. Avoid &lt;code&gt;expand=all&lt;/code&gt; on collections unless you enjoy timeouts.&lt;/p&gt;




&lt;p&gt;The full post has 12 examples — including calling child collections directly, error responses (400/401/403) and what they actually mean, and pagination loops: &lt;a href="https://opalapi.dev/blog/oracle-hcm-rest-api-examples/" rel="noopener noreferrer"&gt;Oracle HCM REST API Examples: 12 Real Requests You Can Copy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I build &lt;a href="https://opalapi.dev/" rel="noopener noreferrer"&gt;OPAL&lt;/a&gt;, an offline Oracle Fusion API explorer — 59,000+ HCM/FSCM endpoints searchable without internet, with visual &lt;a href="https://opalapi.dev/blog/oracle-fusion-rest-api-q-parameter/" rel="noopener noreferrer"&gt;q filter&lt;/a&gt; and finder builders and a full &lt;a href="https://opalapi.dev/apis/" rel="noopener noreferrer"&gt;endpoint reference&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>oracle</category>
      <category>api</category>
      <category>rest</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>"Oracle Fusion REST API Authentication: Basic Auth vs JWT vs OAuth 2.0"</title>
      <dc:creator>Mostafa Mansour</dc:creator>
      <pubDate>Sun, 12 Jul 2026 08:12:37 +0000</pubDate>
      <link>https://dev.to/mostafamansour1/oracle-fusion-rest-api-authentication-basic-auth-vs-jwt-vs-oauth-20-4i79</link>
      <guid>https://dev.to/mostafamansour1/oracle-fusion-rest-api-authentication-basic-auth-vs-jwt-vs-oauth-20-4i79</guid>
      <description>&lt;p&gt;Every Oracle Fusion REST API call — HCM, Financials, or SCM — starts with the same question: how do I authenticate? Oracle supports three mechanisms, and picking the wrong one for your scenario is the most common reason integrations stall in week one.&lt;/p&gt;

&lt;p&gt;Here's the short version of each, when to use it, and the 401-vs-403 distinction that resolves most "authentication" tickets.&lt;/p&gt;

&lt;h2&gt;
  
  
  One rule first
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Fusion authorization is always user-based.&lt;/strong&gt; Whatever method you choose, the token or credential resolves to a Fusion user, and that user's roles decide what the request can touch. There is no app-only access to business data — server-to-server flows run as a dedicated integration user.&lt;/p&gt;

&lt;h2&gt;
  
  
  Option 1: Basic Auth over TLS
&lt;/h2&gt;

&lt;p&gt;Zero setup. Credentials travel base64-encoded in the &lt;code&gt;Authorization&lt;/code&gt; header on every request.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s1"&gt;'integration.user@example.com:YourPassword'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s1"&gt;'https://acme.fa.us2.oraclecloud.com/hcmRestApi/resources/11.13.18.05/workers?limit=5'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fine for development and quick internal scripts. Not great long-term: passwords expire on the pod's rotation policy (integrations break silently at 3 a.m.), and the header is the full identity — replayable if leaked.&lt;/p&gt;

&lt;h2&gt;
  
  
  Option 2: JWT bearer with a trusted issuer
&lt;/h2&gt;

&lt;p&gt;The middle path. Your system signs a JWT with a private key; Fusion validates it against a certificate you uploaded once (Security Console → API Authentication). No identity-domain round trip per request, no password rotation problem.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"iss"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"www.example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"prn"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"integration.user@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sub"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"integration.user@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"iat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1780000000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"exp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1780000900&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sign with RS256, send as &lt;code&gt;Authorization: Bearer &amp;lt;jwt&amp;gt;&lt;/code&gt;. The &lt;code&gt;prn&lt;/code&gt;/&lt;code&gt;sub&lt;/code&gt; claim must match an active Fusion username — that user's roles are what the request runs with. Keep &lt;code&gt;exp&lt;/code&gt; short; the token is self-contained, so a leaked one is valid until expiry.&lt;/p&gt;

&lt;h2&gt;
  
  
  Option 3: OAuth 2.0 via IDCS / IAM
&lt;/h2&gt;

&lt;p&gt;The production-grade option, and required when a third party or federation (Entra ID, Okta) is involved. Register a confidential application in the identity domain linked to your Fusion instance, enable the grants you need, add the Fusion resource scope.&lt;/p&gt;

&lt;p&gt;Because Fusion needs a user context, pure client-credentials tokens are not enough for business-object APIs — server-to-server flows use the &lt;strong&gt;user assertion&lt;/strong&gt; variant: your app authenticates with its client credentials and asserts which Fusion user the token represents.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;client_id&amp;gt;:&amp;lt;client_secret&amp;gt;'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data-urlencode&lt;/span&gt; &lt;span class="s1"&gt;'assertion=&amp;lt;signed user-assertion JWT&amp;gt;'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data-urlencode&lt;/span&gt; &lt;span class="s1"&gt;'scope=&amp;lt;fusion app scope&amp;gt;'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s1"&gt;'https://idcs-abc123.identity.oraclecloud.com/oauth2/v1/token'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The win over trusted-issuer JWT: central revocation, audit, token lifetime policy, and rotation live in the identity domain instead of your code.&lt;/p&gt;

&lt;h2&gt;
  
  
  401 vs 403 — the distinction that saves hours
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;401 Unauthorized&lt;/strong&gt; — Fusion doesn't know who you are: wrong password, expired token, clock skew on &lt;code&gt;iat&lt;/code&gt;/&lt;code&gt;exp&lt;/code&gt;, issuer certificate not uploaded, malformed header.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;403 Forbidden&lt;/strong&gt; — Fusion knows who you are and says no: the integration user is missing the duty/job role for that resource, or data security scopes the user out of that business unit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;404 on a real endpoint&lt;/strong&gt; — sometimes authorization in disguise: a few resources return 404 instead of 403 when the user has no access. Check roles before doubting the URL.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If &lt;code&gt;/workers&lt;/code&gt; returns 403 but &lt;code&gt;/locations&lt;/code&gt; returns 200, your auth is fine — a role is missing. That's fixed in the Security Console, not in your code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choosing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Proof of concept → Basic Auth&lt;/li&gt;
&lt;li&gt;Scheduled integration you own end-to-end → JWT trusted issuer&lt;/li&gt;
&lt;li&gt;Production, multiple consumers, federation, anything user-facing → OAuth 2.0&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And always: a dedicated integration user with minimum roles. Never run integrations as a personal account, and never grant broad roles to "make the 403s go away."&lt;/p&gt;




&lt;p&gt;The full guide — with the complete setup steps, header examples, and troubleshooting table — is on our blog: &lt;a href="https://opalapi.dev/blog/oracle-fusion-rest-api-authentication/" rel="noopener noreferrer"&gt;Oracle Fusion REST API Authentication&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I build &lt;a href="https://opalapi.dev/" rel="noopener noreferrer"&gt;OPAL&lt;/a&gt;, an offline Oracle Fusion API explorer — 59,000+ HCM/FSCM endpoints searchable without internet, with visual &lt;a href="https://opalapi.dev/blog/oracle-fusion-rest-api-q-parameter/" rel="noopener noreferrer"&gt;q filter&lt;/a&gt; and finder builders and a full &lt;a href="https://opalapi.dev/apis/" rel="noopener noreferrer"&gt;endpoint reference&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>oracle</category>
      <category>api</category>
      <category>security</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Why the Oracle Fusion REST API q Parameter Fails and How to Fix It</title>
      <dc:creator>Mostafa Mansour</dc:creator>
      <pubDate>Sat, 11 Jul 2026 08:02:05 +0000</pubDate>
      <link>https://dev.to/mostafamansour1/why-the-oracle-fusion-rest-api-q-parameter-fails-and-how-to-fix-it-1847</link>
      <guid>https://dev.to/mostafamansour1/why-the-oracle-fusion-rest-api-q-parameter-fails-and-how-to-fix-it-1847</guid>
      <description>&lt;p&gt;The &lt;code&gt;q&lt;/code&gt; parameter is one of the most useful parts of Oracle Fusion REST APIs. It lets you filter records directly from the API instead of retrieving a large result set and filtering it later in your integration layer.&lt;/p&gt;

&lt;p&gt;It is also one of the most common reasons Fusion API calls fail.&lt;/p&gt;

&lt;p&gt;A request that looks correct can still return an error like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The query parameter is invalid.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Invalid query expression.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or sometimes the request succeeds but the response is not filtered the way you expected.&lt;/p&gt;

&lt;p&gt;This usually happens because Oracle Fusion REST filtering is not the same as SQL filtering. The &lt;code&gt;q&lt;/code&gt; parameter only works with fields and operators that are supported by the specific REST resource you are calling.&lt;/p&gt;

&lt;p&gt;This guide explains the most common reasons the &lt;code&gt;q&lt;/code&gt; parameter fails and how to troubleshoot it correctly.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is the q parameter in Oracle Fusion REST APIs?
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;q&lt;/code&gt; parameter is used to filter records in Oracle Fusion REST API requests.&lt;/p&gt;

&lt;p&gt;A simple example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /hcmRestApi/resources/11.13.18.05/workers?q=PersonNumber='10001'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another example from Financials:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /fscmRestApi/resources/11.13.18.05/invoices?q=InvoiceNumber='INV-1001'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The general pattern is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;q=FieldName operator value
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Common operators include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=
!=
&amp;gt;
&amp;lt;
&amp;gt;=
&amp;lt;=
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Some endpoints also support operators such as &lt;code&gt;LIKE&lt;/code&gt;, &lt;code&gt;BETWEEN&lt;/code&gt;, or null checks, but support is not universal. You must confirm what the specific endpoint accepts.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why the q parameter fails
&lt;/h2&gt;

&lt;p&gt;Most &lt;code&gt;q&lt;/code&gt; issues come from one of these causes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The field is not queryable.&lt;/li&gt;
&lt;li&gt;The field belongs to a child resource.&lt;/li&gt;
&lt;li&gt;The field name is wrong.&lt;/li&gt;
&lt;li&gt;The value format is wrong.&lt;/li&gt;
&lt;li&gt;The operator is not supported for that field.&lt;/li&gt;
&lt;li&gt;The filter is being applied at the wrong API level.&lt;/li&gt;
&lt;li&gt;The endpoint expects a finder instead of a normal &lt;code&gt;q&lt;/code&gt; filter.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's go through each one.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The field is not queryable
&lt;/h2&gt;

&lt;p&gt;Not every field returned by a REST API response can be used inside &lt;code&gt;q&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This is one of the biggest surprises for Fusion developers.&lt;/p&gt;

&lt;p&gt;You may see a field in the response, for example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"PersonNumber"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"10001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"DisplayName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Test Employee"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"HireDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-01-01"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But that does not automatically mean all three fields are valid in &lt;code&gt;q&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This may work:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /hcmRestApi/resources/11.13.18.05/workers?q=PersonNumber='10001'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But this may fail depending on the endpoint metadata:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /hcmRestApi/resources/11.13.18.05/workers?q=HireDate='2024-01-01'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response field and the queryable field list are not always the same.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to fix it
&lt;/h3&gt;

&lt;p&gt;Before writing the filter, check whether the field is queryable for that REST resource.&lt;/p&gt;

&lt;p&gt;You can do that by reviewing the OpenAPI metadata or the Oracle REST documentation for that resource. If the field is not listed as queryable, use another field, a finder, or a lower-level child endpoint.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. The field belongs to a child resource
&lt;/h2&gt;

&lt;p&gt;This is very common with the Workers API.&lt;/p&gt;

&lt;p&gt;For example, you may want active employee assignments only:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AssignmentType = 'E'
AssignmentStatusType = 'ACTIVE'
PrimaryFlag = true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But these fields usually belong to the worker assignment child resource, not the top-level worker resource.&lt;/p&gt;

&lt;p&gt;This kind of request may not work as expected:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /hcmRestApi/resources/11.13.18.05/workers?q=AssignmentStatusType='ACTIVE'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because &lt;code&gt;/workers&lt;/code&gt; filters workers at the worker level. It does not always filter nested child records such as work relationships or assignments.&lt;/p&gt;

&lt;p&gt;Even if you use &lt;code&gt;expand&lt;/code&gt;, the &lt;code&gt;q&lt;/code&gt; filter is still applied to the parent resource unless Oracle explicitly supports filtering the child resource in that call.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /hcmRestApi/resources/11.13.18.05/workers?q=PersonNumber='10001'&amp;amp;expand=workRelationships.assignments
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This can return the worker and expand assignments, but it does not mean you can filter the assignment rows from the parent &lt;code&gt;q&lt;/code&gt; parameter.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to fix it
&lt;/h3&gt;

&lt;p&gt;Call the child resource directly when you need child-level filtering.&lt;/p&gt;

&lt;p&gt;The pattern is usually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /hcmRestApi/resources/11.13.18.05/workers/{workersUniqID}/child/workRelationships/{workRelationshipsUniqID}/child/assignments?q=AssignmentStatusType='ACTIVE'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is more work because you may need parent IDs first, but the filter is applied at the correct resource level.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. The field name is wrong
&lt;/h2&gt;

&lt;p&gt;Oracle Fusion REST field names are case-sensitive in many contexts.&lt;/p&gt;

&lt;p&gt;This can fail:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;q=personnumber='10001'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the correct style:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;q=PersonNumber='10001'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same applies to fields such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;InvoiceNumber
BusinessUnit
PersonId
AssignmentId
DocumentType
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Small spelling or casing differences can break the filter.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to fix it
&lt;/h3&gt;

&lt;p&gt;Copy the exact field name from the REST metadata or from a working response. Do not guess field names from the Fusion UI label.&lt;/p&gt;

&lt;p&gt;For example, the UI may say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Person Number
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But the API field may be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PersonNumber
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. The value format is wrong
&lt;/h2&gt;

&lt;p&gt;String values normally need quotes.&lt;/p&gt;

&lt;p&gt;Correct:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;q=PersonNumber='10001'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Risky or invalid:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;q=PersonNumber=10001
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For dates, use the format expected by the API. In many cases, ISO date format is safest:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;q=CreationDate&amp;gt;='2026-01-01'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For booleans, check the endpoint behavior. Some APIs use true/false, while others expose Y/N, flags, or lookup codes.&lt;/p&gt;

&lt;p&gt;Examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;q=PrimaryFlag=true
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;q=StatusCode='Y'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The correct value depends on the field definition.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. The operator is not supported
&lt;/h2&gt;

&lt;p&gt;Developers often try SQL-style expressions in Oracle Fusion REST APIs.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;q=DisplayName LIKE '%John%'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This may not work on every endpoint.&lt;/p&gt;

&lt;p&gt;Even when &lt;code&gt;LIKE&lt;/code&gt; works in one REST resource, it may not work in another. Oracle Fusion REST APIs are large, and behavior can vary by module and resource.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to fix it
&lt;/h3&gt;

&lt;p&gt;Start with simple equality:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;q=DisplayName='John Smith'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then test other operators only after confirming the field supports them.&lt;/p&gt;

&lt;p&gt;If partial search is required, check whether the endpoint provides a finder that supports keyword-style search.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Null checks can be sensitive
&lt;/h2&gt;

&lt;p&gt;Another common issue is filtering null values.&lt;/p&gt;

&lt;p&gt;Developers may try:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;q=InactiveDate is null
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;q=InactiveDate=null
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Whether this works depends on the resource and supported query syntax. Some resources support null-style filtering. Others do not.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to fix it
&lt;/h3&gt;

&lt;p&gt;Check the supported query operators for that endpoint. If null filtering is not supported, you may need to retrieve a smaller set of records using another condition, then filter null values in your integration layer.&lt;/p&gt;

&lt;p&gt;Not perfect, but better than pulling the full dataset without any filter.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. You may need a finder instead of q
&lt;/h2&gt;

&lt;p&gt;Oracle Fusion REST APIs often expose named finders.&lt;/p&gt;

&lt;p&gt;A finder is a predefined search pattern with specific parameters.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /hcmRestApi/resources/11.13.18.05/workers?finder=findByPersonId;PersonId=300000123456789
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finders can be more reliable than &lt;code&gt;q&lt;/code&gt; when Oracle has already defined the intended search path.&lt;/p&gt;

&lt;p&gt;If a &lt;code&gt;q&lt;/code&gt; filter keeps failing, check whether the endpoint has a finder for the same business scenario.&lt;/p&gt;




&lt;h2&gt;
  
  
  Practical troubleshooting checklist
&lt;/h2&gt;

&lt;p&gt;When a &lt;code&gt;q&lt;/code&gt; filter does not work, follow this order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Confirm the endpoint is correct.&lt;/li&gt;
&lt;li&gt;Confirm the field belongs to that exact resource, not a child resource.&lt;/li&gt;
&lt;li&gt;Confirm the field is queryable.&lt;/li&gt;
&lt;li&gt;Confirm the exact field name and casing.&lt;/li&gt;
&lt;li&gt;Confirm the value format.&lt;/li&gt;
&lt;li&gt;Start with one filter condition only.&lt;/li&gt;
&lt;li&gt;Add additional conditions one by one.&lt;/li&gt;
&lt;li&gt;Check whether a finder exists.&lt;/li&gt;
&lt;li&gt;Test the child endpoint directly if filtering child data.&lt;/li&gt;
&lt;li&gt;Only filter in the integration layer after reducing the response as much as possible.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Example: Workers API q filter
&lt;/h2&gt;

&lt;p&gt;A simple worker lookup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /hcmRestApi/resources/11.13.18.05/workers?q=PersonNumber='10001'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you need assignment-level conditions, do not assume this will work from the parent worker resource:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /hcmRestApi/resources/11.13.18.05/workers?q=AssignmentStatusType='ACTIVE'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead, inspect the worker child resources and test the assignments child endpoint.&lt;/p&gt;




&lt;h2&gt;
  
  
  Example: Invoices API q filter
&lt;/h2&gt;

&lt;p&gt;A common invoice lookup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /fscmRestApi/resources/11.13.18.05/invoices?q=InvoiceNumber='INV-1001'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you need invoice attachments, use &lt;code&gt;expand&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /fscmRestApi/resources/11.13.18.05/invoices?q=InvoiceNumber='INV-1001'&amp;amp;expand=attachments
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But remember: expanding attachments does not mean the parent &lt;code&gt;q&lt;/code&gt; filter can filter attachment fields.&lt;/p&gt;




&lt;h2&gt;
  
  
  How OPAL helps
&lt;/h2&gt;

&lt;p&gt;OPAL is built for this exact workflow.&lt;/p&gt;

&lt;p&gt;Instead of guessing the &lt;code&gt;q&lt;/code&gt; syntax from documentation pages, OPAL lets you search Oracle Fusion REST endpoints, inspect available query fields, check finders, browse child resources, and test the request directly against your Fusion environment.&lt;/p&gt;

&lt;p&gt;This is especially useful when working with large APIs like Workers, Invoices, Purchase Orders, Document Records, Learning, or Procurement resources.&lt;/p&gt;

&lt;p&gt;You can download OPAL here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://opalapi.dev" rel="noopener noreferrer"&gt;https://opalapi.dev&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Final recommendation
&lt;/h2&gt;

&lt;p&gt;Do not treat the &lt;code&gt;q&lt;/code&gt; parameter like SQL.&lt;/p&gt;

&lt;p&gt;Treat it as a resource-specific filter syntax.&lt;/p&gt;

&lt;p&gt;The safest approach is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check the exact REST resource.&lt;/li&gt;
&lt;li&gt;Check the queryable fields.&lt;/li&gt;
&lt;li&gt;Avoid filtering child data from the parent endpoint.&lt;/li&gt;
&lt;li&gt;Use finders when available.&lt;/li&gt;
&lt;li&gt;Test small filters first.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This will save a lot of time and reduce unnecessary trial and error in Postman or integration tools.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This post is part of our complete &lt;a href="https://opalapi.dev/oracle-hcm-api/" rel="noopener noreferrer"&gt;Oracle HCM API guide&lt;/a&gt; — base URLs, authentication, &lt;code&gt;q&lt;/code&gt; filters, finders, key endpoints, and common errors in one place.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://opalapi.dev/blog/oracle-fusion-rest-api-q-parameter/" rel="noopener noreferrer"&gt;opalapi.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>oracle</category>
      <category>api</category>
      <category>rest</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
