Getting started
The Pickware ERP API uses GraphQL over HTTPS. Every request — queries and mutations — is an HTTP POST to the GraphQL endpoint with a JSON body containing a query string and, optionally, a variables object and an operationName. GET is not supported; use POST even for read-only queries. The path segment after /api/graphql/ is the schema version the request is executed against. The exact API base URL is provided during onboarding. Every request must carry a bearer access token; see Authentication.
POST https://<your-pickware-api-domain>/api/graphql/2026-06-unstable
Content-Type: application/json
Run your first query
This query fetches the first five products and their pagination cursors. See the generated products query, Product type, and ProductFilterInput reference for all available fields and filters.
query FirstProducts {
products(first: 5) {
edges {
cursor
node {
id
productNumber
gtin
name
physicalStock
availableStock
}
}
pageInfo {
hasNextPage
endCursor
}
}
}
Minimal curl example
First exchange your access key and secret access key for an access token and keep the response's access_token value in a variable. Authentication covers this exchange in full, along with the access token lifetime and the scopes a token needs.
PICKWARE_GRAPHQL_ACCESS_TOKEN=$(curl --silent https://<your-pickware-api-domain>/api/oauth/token \
--request POST \
--header "Content-Type: application/json" \
--data "{
\"grant_type\": \"client_credentials\",
\"client_id\": \"$PICKWARE_GRAPHQL_ACCESS_KEY\",
\"client_secret\": \"$PICKWARE_GRAPHQL_SECRET_ACCESS_KEY\"
}" | jq --raw-output .access_token)
Then send the query with that access token as a bearer token:
curl https://<your-pickware-api-domain>/api/graphql/2026-06-unstable \
--request POST \
--header "Authorization: Bearer $PICKWARE_GRAPHQL_ACCESS_TOKEN" \
--header "Content-Type: application/json" \
--data '{"query":"query FirstProducts { products(first: 5) { edges { node { id productNumber gtin name physicalStock availableStock } } pageInfo { hasNextPage endCursor } } }"}'
Using a GraphQL client library
The curl example shows that the wire protocol is plain JSON over HTTPS, so any HTTP client works. For real integrations a GraphQL client is usually a better fit — it handles variable encoding, response typing, retries, and (with a generated SDK) schema-aware autocomplete. Some well-established options:
- Node / TypeScript:
graphql-requestfor a minimal client,@urql/corefor caching and React/Vue bindings, or Apollo Client when you also want normalized caching. - PHP:
softonic/graphql-clientfor a Guzzle-based HTTP client, orgmostafa/php-graphql-clientfor fluent query building. - Python:
gql(sync and asyncio transports, schema-aware) or the lighterpython-graphql-client.
Pair any of these with a code generator (for example GraphQL Code Generator) to get types and helpers derived from the SDL.
Pagination
List fields use cursor-based pagination. Pass first to limit the page size and after with the endCursor from the previous response to fetch the next page. The shared PageInfo type describes the pagination metadata returned by connection fields.
For synchronization jobs, continue with Working with lists.