survos/quickbase-php

Quickbase JSON REST API client, record-store adapter, and QBL query support. Framework-agnostic -- usable from Symfony, WordPress, or plain PHP.

Maintainers

Package info

github.com/survos/quickbase-php

pkg:composer/survos/quickbase-php

Transparency log

Fund package maintenance!

kbond

Statistics

Installs: 12

Dependents: 1

Suggesters: 0

Stars: 0

Open Issues: 0

2.26.3 2026-08-27 15:45 UTC

This package is auto-updated.

Last update: 2026-08-27 15:46:39 UTC


README

A PHP client for the Quickbase JSON REST API — the API client, a record-store adapter, schema management, and QBL solution support.

Framework-agnostic. It depends on symfony/http-client-contracts, an interface package, so any implementation works. The same code runs in a Symfony application, a WordPress plugin, or a plain script.

Other Quickbase packages exist on Packagist; most target the older XML API. This one is built for the JSON REST API and for treating an application's schema as something you version rather than click.

composer require survos/quickbase-php symfony/http-client

Authentication

Quickbase authenticates with a realm hostname and a user token, both sent as headers. Configure them once on the HTTP client:

use Symfony\Component\HttpClient\HttpClient;
use Survos\Quickbase\Client\QuickbaseClient;

$client = new QuickbaseClient(HttpClient::create()->withOptions([
    'base_uri' => 'https://api.quickbase.com/v1/',
    'headers'  => [
        'QB-Realm-Hostname' => $_ENV['QUICKBASE_REALM'],
        'Authorization'     => 'QB-USER-TOKEN '.$_ENV['QUICKBASE_API_KEY'],
    ],
]));

Reading and writing records

use Survos\Quickbase\Adapter\QuickbaseAdapterFactory;
use Survos\RecordStore\Model\{ConnectionConfiguration, Record, RecordQuery, TableReference, UpsertRequest};

$adapter = (new QuickbaseAdapterFactory($client))
    ->create(new ConnectionConfiguration(name: 'rappathome', driver: 'quickbase'));

$members = new TableReference(
    application:   'rappathome',
    applicationId: $appId,
    connection:    'rappathome',
    name:          'members',
    id:            $tableId,
    fields:        ['bio' => 12],   // logical name => Quickbase field id
);

$page = $adapter->query($members, new RecordQuery(limit: 20));

$adapter->upsert($members, new UpsertRequest(
    records:   [new Record(fields: ['bio' => 'Updated bio'], id: 314)],
    keyFields: ['id'],
));

Because TableReference carries a logical-name to field-id map, application code says bio rather than 12. Quickbase's numeric field ids stay at the edge.

Writes use the ordinary records API, so Pipelines and Automations that listen on record events fire the same way they do for a change made in the Quickbase UI.

Coverage

Wrapped, against Quickbase's published operation list: apps, tables, fields, field usage, relationships, reports (list, fetch, run), records (query, upsert, delete, modified-since), file attachments (download, delete), formula evaluation, temporary tokens, app events, and QBL solutions.

Deliberately not wrapped: user and group governancegetUsers, denyUsers, trustees, roles, group membership, user tokens, and platform analytics. Those manage Quickbase seats, and the pattern this library is built for keeps members out of Quickbase entirely: an application authenticates its own service account, and a member is a row in a table you define, not a licensed user. Anything here is still reachable through request() / requestRaw() if you need it.

Schema and QBL

Schema\QuickbaseSchemaManager and Qbl\QblDocument cover the parts of Quickbase that are about structure rather than rows. The client wraps the full surface: apps, tables, fields, relationships, reports, and solution export/create/update/diff in QBL — exportSolution(), createSolution(), updateSolution(), solutionChanges().

QuickbaseAppRegistry resolves friendly names to app ids, builds deep links with appUrl() and tableUrl(), and can mark an app read-only so a misconfigured environment cannot write to production.

Provider neutrality

The adapter implements RecordStoreAdapterInterface, the same contract survos/grist-php implements. Code written against that interface runs on either backend, and the choice becomes configuration. Anything Quickbase cannot do raises UnsupportedRecordStoreOperation rather than being quietly approximated.

Symfony

survos/quickbase-bundle provides the Symfony integration — configuration, service wiring, console commands. It contains no Quickbase logic of its own.